Строка вызова функции
Можно ли внутри функции определить строку, её вызвавшую?
Например - $=function(x) { var a = []; a.css = function(b) { перебираем массив элементов this[i] } // тут через push наполняем a return a; } Внутри $ нужно определить, если в строке вызова присутствует "css", значит из $ возвращаем массив, иначе возвращаем элемент, т.е. $('x').css('y') - из $ возвращаем массив элементов, так как css() присутствует в строке вызова, а тут - $('x').style из $ возвращаем сам единственный элемент, так как css() в строке вызова нет. Пока делаю так - для моих методов $('x').css('y'), для стандартных $('x')[0].style, но некрасиво как-то, хотелось бы без [0] и долнительного маркера в параметрах. p.s. код к jquery никакого отношения не имеет. |
Бред какой-то, честно говоря.
|
Аргументы? Предлагайте варианты решения. Видимо в самой функции нельзя определить кто её вызвал, arguments.caller в ie возвращает Object object, в остальных undefined. Тогда только остаётся по маркеру-параметру определять что возвращать.
|
Если непонятно, приведу пример с jquery, в котором не работает то, что я хочу сделать.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title></title> <style> p { border:2px solid red; width:100px; height:100px; margin:20px; } </style> <script type="text/javascript" src="jquery-1.3.2.min.js"></script> </head> <body> <p id="x"></p> <input onclick="$('#x').css({'background':'blue'})" type="button" value="test 1"> // работает <input onclick="$('#x').style.background='blue'" type="button" value="test 2"> // получим ошибку - неизвестный style, так как вернулся массив, а не элемент <input onclick="$('#x')[0].style.background='blue'" type="button" value="test 3"> // прекрасно отработает, так как выдёргиваем первый элемент из массива </body> </html> Я хочу сделать, чтобы это происходило прозрачно, т.е. чтобы внутри самой $() определялось что вернуть, элемент или массив, тогда непонадобится подставлять [0] или вводить дополнительный параметр-индикатор. |
Цитата:
Цитата:
arguments.callee.caller |
Спасибо за arguments.callee.caller, ошибся в написании. Прогнал по браузерам, при таком вызове -
window.onload=function() { $('x').css({background:'#00f'}); $('x').style.width='10px'; } возвращается - function() { $('x').css({background:'#00f'}); $('x').style.width='10px'; } Можно было бы регуляркой выдрать css и style, но как проверить какая из двух строк вызвала $ не знаю + вызывающая строка должна быть внутри функции, иначе null. Ладно, видимо придётся к входящему параметру дописывать флаг. |
Смысл понял, но не понял зачем это все ? Разве css не станавливает свойство style.* для каждого элемента? Если так, то зачем ломать голову?
Простое решение - перегонять ссылку .style первого элемента в массиве как свойство массива. Хотя так не пробовал но должно сработать. <div style='width:10px; height: 10px; background: #0f0;'></div> <div style='width:20px; height: 20px;'></div> <script type='text/javascript'> function $(tag){ var arr = [], els = document.getElementsByTagName(tag),i=els.length; while (i--) arr[i] = els[i]; arr.style = (arr[0]||{style:{}}).style; return arr; } setTimeout(function(){ alert($('div').style.background='#000') },2000);</script> Как и ожидал, работает. Но не тестил в др браузерах |
style - это просто пример, частный случай. На самом деле внутри $ будет несколько моих функций. Основное предназначение $() - вернуть конкретный элемент для дальнейшего его использования со стандартным js (setAttribute, id и т.д.) либо вернуть массив элементов (пусть даже из одного элемента, но массив) для использования его в моих функциях внутри $(). Но так как функции $() неизвестна полная строка вызова, она не знает что возвратить, элемент или массив, поэтому пока додумался до маркера во входящем параметре либо выдёргивании первого элемента из массива для стандартного js - $()[0]. Думаю также разделить $() на две функции, первая будет всегда возвращать сам элемент для работы со стандартным js - $$$().setAttribute(), а вторая всегда массив для работы с $().моя_функция().
Если мы напишем document.getElementById('x').css(), мы ведь получим ошибку о неизвестном css(), а если напишем $('x').style, то получим ошибку о неизвестном style, так как внутри $ есть css(), но нету style. Хотел сделать чтобы было прозрачно и определялось автоматически, т.е. внутри $() определялось что вернуть и тогда бы работали оба варианта - $().css() и $().getAttribute(), даже если внутри $() нету этого getAttribute(). p.s. элемент всмысле document.getElementById('x'); |
увы. в JS нет магических функций типа __call и т.п. а жаль. это бы и спасло.
|
возвращайте всегда массив.
а в нем определите методы, аналогичные методам DOM для одного объхекта |
Часовой пояс GMT +3, время: 11:24. |