Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Достать функцию по имени в строке


Автор: Ashen 5.9.2006, 10:28
Надо приаттачить к элементу событие в зависимости от имени класса, т.е. можно 
ли написать в JavaScript что-то типа следующего PHP-шного кода:
Код

$className="cClass";
$newClass=new $className;


для случая(JavaScript):


Код

newListItem.addEventListener("click",function() { /*Здесь должно быть имя класса*/.jslTPSetActive(1,1);},false);


Строка кода из функции класса - имя класса хранится в this.name

Используется код http://forum.vingrad.ru/index.php?showtopic=32350 из статьи Sardar'a

Автор: Sardar 5.9.2006, 11:03
Ashen, а что конкретно не получаеться? В JS всё что угодно, включая функии/конструкторы ("классы") доступны по именам в момент исполнения, т.к. это просто переменные (смволы). Другое дело что нет в JS статичных методов в том виде, в котором ты это себе представляешь (и в этом сила JS). Если  написать myClass.jslTPSetActive(1,1), и myClass это функция, то вызовем её метод jslTPSetActive, это вероятно не то что ты хочешь.

Ashen, JS на много гибче PHP, там где в PHP пользуем строки и call_user_func, в JS это нормальные выражения, т.к. функции и вообще всё что угодно, это обьекты, лежащие в переменных.
Отсюда: выкладывай что ты хочешь сделать в функциональном (что делать) смысле.

Цитата(Ashen @  5.9.2006,  09:28 Найти цитируемый пост)
можно ли написать в JavaScript что-то типа следующего PHP-шного кода:

Код
function test() {}
var myTest = test;

var a = new myTest();
var b = "myTest"; //строка
var c = window[b]; //наша myTest, хотя так делать не красиво
var d = new c(); //или сразу new window[b];

Автор: Ashen 5.9.2006, 11:20
Суть - есть класс, который создает два списка. Элементы списков можно перебрасывать из одного списка в другой (все сделано div'ами и js) при создании списка во время загрузки список генерится document.write(). Но потом при реализации переброски элемента из одного списка в другой пришлось задействовать DOM. С генерацией элементов проблем не возникло, а вот с аттачем событий начались траблы  smile . Просмотрел твою статью - понял мало (опыт написания на JavaScript  - неделя), но код дернул и прикрутил - все работает перфектно, но мне чтобы функция выполнялась от конкретного объекта класса, т.е. что бы код
Код

newListItem.addEventListener("click",function() { /*Здесь должно быть имя класса*/.jslTPSetActive(1,1);},false);

делал, то же, что и например:
Код

document.write("<div id=\"elem"+i+"\" onclick=\""+this.name+".MethodName()\"></div>");

И плиз, пока не надо ссылки на мануалы и книги - просто времени нет читать  smile 
ЗАМЕЧЕНИЕ:
Все вышеупомянутые куски кода происходят внутри класса.

Автор: Sardar 5.9.2006, 11:44
Ashen, замени /*Здесь должно быть имя класса*/ на this, всегда указывает на элемент на котором зарегистрировали событие, т.е. this.style.backgroundColor="red" изменит стиль элемента. Почему так уже обьяснял много раз на форуме smile

Автор: Ashen 5.9.2006, 12:10
Пробовал... не совсем же я деревяшка smile - В итоге нарываемся на
Цитата

Error: Object doesn't support this property or method
Code: 0


Добавлено @ 12:14 
Вот обходной вариант, но работает только в Mozilla  smile 
Код

<html>
<head>
<title>ASD</title>
<script type="text/javascript">
function evnt()
{
    document.write("<div id=\"elem"+i+"\" onclick=\""+this.name+".MethodName()\"></div>");
}
function writeContent()
{
    //document.write('<div style="border:1px solid lime">Lime</div>');
    var root=document.getElementById('main');
    var chld=document.createElement('script');
    chld.setAttribute("language","javascript");
    var code=document.createTextNode('evnt();');
    
    chld.appendChild(code);
    root.appendChild(chld);
}
</script>
</head>
<body>
<div id="main" style="border:1px solid red;">
Simple text
</div>
<input type="button" onclick="writeContent()" value="push_me"/>
</body>
</html>


IE пишет:
Цитата

Unexpected call to method or property access

Автор: Sardar 5.9.2006, 22:28
writeContent() - это нужно в копилку самых не мыслимых решений smile 

Ashen, без шуток, у тебя очень не стандартное мышление, жаль оно опять же не эффективно, в смысле даёт не эффективные решения. Так писать не нужно... никогда...  smile 

Код
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>ASD</title>

<script type="text/javascript">
function evnt(tgt, rep) {
    var d = document.createElement('div');
    d.appendChild(document.createTextNode("Test"));
    d.addEventListener("click", function(){ rep.myMethod(this.tagName) }, false);
    tgt.appendChild(d);
}


function writeContent() {
    var root = document.getElementById('main');
    var myObj = { myMethod: function(t){ alert("I'm the myObj.myMethod! Arg: "+t);}};
    evnt(root, myObj);
}
</script>
</head>
<body>
    <div id="main" style="border:1px solid red;">Simple text</div>
    <input type="button" onclick="writeContent()" value="Push me">
</body>
</html>

Автор: Ashen 6.9.2006, 09:36
млин, оборжал -  smile 
там и вправду немного вата написана - дает не совсем то (совсем не то) - 
потом уже догнал, когда пытался приладить.
но все равно пасиб... smile 

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