Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.08.2010, 08:33
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Строка вызова функции
Можно ли внутри функции определить строку, её вызвавшую?
Например -
$=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 никакого отношения не имеет.
Ответить с цитированием
  #2 (permalink)  
Старый 07.08.2010, 09:05
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Бред какой-то, честно говоря.
Ответить с цитированием
  #3 (permalink)  
Старый 07.08.2010, 09:23
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Аргументы? Предлагайте варианты решения. Видимо в самой функции нельзя определить кто её вызвал, arguments.caller в ie возвращает Object object, в остальных undefined. Тогда только остаётся по маркеру-параметру определять что возвращать.

Последний раз редактировалось DMH, 07.08.2010 в 09:58.
Ответить с цитированием
  #4 (permalink)  
Старый 07.08.2010, 10:19
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Если непонятно, приведу пример с 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] или вводить дополнительный параметр-индикатор.
Ответить с цитированием
  #5 (permalink)  
Старый 07.08.2010, 11:13
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от DMH
Тогда только остаётся по маркеру-параметру определять что возвращать.
Разумеется возвращаемое значение функции не должно зависеть от того, где и как она вызвана.

Сообщение от DMH
arguments.caller в ie возвращает Object object, в остальных undefined.
arguments.callee.caller
Ответить с цитированием
  #6 (permalink)  
Старый 07.08.2010, 12:06
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Спасибо за 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.

Ладно, видимо придётся к входящему параметру дописывать флаг.
Ответить с цитированием
  #7 (permalink)  
Старый 07.08.2010, 22:35
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Смысл понял, но не понял зачем это все ? Разве 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>


Как и ожидал, работает. Но не тестил в др браузерах
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт

Последний раз редактировалось PeaceCoder, 07.08.2010 в 22:45.
Ответить с цитированием
  #8 (permalink)  
Старый 08.08.2010, 06:12
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

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');

Последний раз редактировалось DMH, 08.08.2010 в 06:21.
Ответить с цитированием
  #9 (permalink)  
Старый 08.08.2010, 18:04
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

увы. в JS нет магических функций типа __call и т.п. а жаль. это бы и спасло.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Ответить с цитированием
  #10 (permalink)  
Старый 09.08.2010, 13:41
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

возвращайте всегда массив.
а в нем определите методы, аналогичные методам DOM для одного объхекта
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переменная как значение функции. Jurasmi Общие вопросы Javascript 7 22.04.2010 12:45
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03
Возвращение значения из функции dba Events/DOM/Window 21 06.10.2009 01:33
Кросс-браузерные функции B~Vladi Ваши сайты и скрипты 128 01.09.2009 17:11
PHP ООП и вложенные функции Tim Серверные языки и технологии 6 15.06.2009 08:01