Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > передача параметра в <a onclick>


Автор: 0000 26.10.2008, 13:33
Привет всем..Вот пример кода...

Код

  <img id="img_obj" src="bear.jpg"></img>
  <script>
    
Код

function GetProperties(obj,parent)
    {
     document.write("<ul>");
     for (var i in obj)
     {
        if (parent)
            document.write("<li>" + parent + "." + i + "=");
        else
            document.write("<li>" + obj.id + "." + i + "=");
        if(IsObject(obj[i]))
         {    
//???????????????????????????               
document.write('<a href="#view" OnClick="GetChildProperties(' + obj +',' + i + ',' + parent + ')"> ' + obj[i] + '</a>');
//???????????
         }
        else
        document.write(obj[i]);
       }
      document.write("</ul>");
     }
    
    function IsObject(obj)
    {
        return (typeof(obj) == 'object') && (obj!=null)
    }
    function GetChildProperties(obj, i, parent)
    {
        alert("1212");
    }    
        
    GetProperties(img_obj);
    
 </script>


Объясните момент, почему в выделенной строке если передавать параметр obj - не работает, а если любой другой (например i или parent или строку, число и т.д.), то работает??? что в параметре obj такого особенного?

Тока объясните плз максимально просто без выпендрежа типа иди в поиск и замудренных слов...плз.спасибо

Автор: ksnk 26.10.2008, 14:53
Цитата

максимально просто без выпендрежа типа иди в поиск

А без синтаксических ошибок код слабо предъявить?

Автор: 0000 26.10.2008, 15:16
почему-то когда нажимаю на редактирование поста - открывается окно и подвисает..на мышу реагирует, на клаву нет...ну я подумал клава отрубилась, побарабанил по кнопкам...а оказалось вот он мне вместо нулл какую кракозябру написал..

Автор: 0000 3.11.2008, 22:29
ну так что, мегаспецы по жаве скрипту.... никто не знает, как объяснить сие явление?

Автор: IDVsbruck 4.11.2008, 02:13
Только вчера на подобную тему в соседнем посте писал.

Насколько понимаю по "максимально просто", то, мягко говоря, ты новичок. Тогда "по-простому" ... smile

1. Результатом действия функции 
Код
...
document.write('<a href="#view" OnClick="GetChildProperties(' + obj +',' + i + ',' + parent + ')"> ' + obj[i] + '</a>');
...

при одной картинке будет следующим:
Код
<a href="#view" OnClick="GetChildProperties([object],0,{name_of_parent})">[object]</a>

С какой стати данная конструкция должна работать?

2. Практика использования "document.write()" очень плохая. Это пример того, как не надо делать. Этот метод отлично подходит только для "Hello, world!"
Для работы с элементами у программера есть модель DOM. Судя по коду, я не очень понимаю, что есть "GetProperties(img_obj);" и как согласуются "GetProperties(img_obj);" и "function GetProperties(obj,parent)". Возможно, он обрезан, и поэтому помочь сложно. Возможно, надо дать более валидный код без сильного обрезания (и двойной вставки кода), тогда помочь будет проще.

3. Допустим, ты отказался от "document.write()" и взял на вооружение DOM (ну, или хотя бы атрибут html контейнера, в который можно поместить ссылки, например, div). В этом случае в цикле будет создаваться ссылка следующим образом:
Код
var link = document.createElement("a");
link.href = "#view";

А дальше идет стандартная ошибка всех новичков:
Код
link.onclick = function() {GetChildProperties(obj, i, parent); return false;};

Однако данная конструкция работать не будет, так как время жизни функции GetProperties, а, следовательно, и переменных obj, i, parent, очень коротко. Следовательно, на момент возникновения события onclick в функцию GetChildProperties будет передаваться неизвестно что (возможно, null).

4. Чтобы обойти данный коллапс, существует понятие замыкания - уникальная возможность javascript. Есть более короткий, но более сложный для понимания вариант:
Код
link.onclick = function(par1, par2, par3) {function() {GetChildProperties(par1, par2, par3);}}(obj, i, parent);

и более длинный, по более понятный:
Код
function GetProperties(obj,parent) {
    ...
    setOnclickOnLink(link, obj, i, parent);
    ...
}
function setOnclickOnLink(link_object, par1, par2, par3) {
    var handler = function() {
        GetChildProperties(par1, par2, par3);
    }
    link_object.onclick = handler;
}


Надеюсь, объяснил достаточно доступно ...

Автор: 0000 4.11.2008, 15:45
Цитата(IDVsbruck @ 4.11.2008,  02:13)
1. Результатом действия функции 
Код
...
document.write('<a href="#view" OnClick="GetChildProperties(' + obj +',' + i + ',' + parent + ')"> ' + obj[i] + '</a>');
...

при одной картинке будет следующим:
Код
<a href="#view" OnClick="GetChildProperties([object],0,{name_of_parent})">[object]</a>

С какой стати данная конструкция должна работать?

т.е. я в функцию GetChildProperties() вообще не могу передать объект?? я же вроде передаю здесь не просто строчку "[object]", а сам объект...я вот этого не понимаю...

за остальное - Great Thanks! 
+1

Автор: IDVsbruck 4.11.2008, 23:56
В функцию - можешь, а с помощью строки, которая будет парситься и вставляться javascript-интерпретатором - нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)