Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   is not defined onclick() (https://javascript.ru/forum/css-html-firefox-mizilla/22396-not-defined-onclick.html)

trololo 17.10.2011 23:29

is not defined onclick()
 
извините что дублирую темы, но возможно я изначально создал не в той ветке.
var ob={
ctor:function()
{
//some start actions
},
someAction:function(param p)
{
//some action
},
anotherAction:function()
{
//here is must be code from first message...
document.getElementById('someId').setAttribute('onclick','ob.someAction(1)');
},
/*few methods and vars
....
*/
}

window.load=ob.ctor();


тоесть вешаем некую функцию из этого же "объекта" на нужный элемент. в опере такое прокатывает. в ff firebug говорит "ob is not defined onclick()"

Kolyaj 18.10.2011 11:32

http://javascript.ru/tutorial/events/intro

trololo 18.10.2011 13:35

тут дело не в обработчике. он ставится нормально и вызывается тоже нормально. если он объявлен отдельной функцией (или же из под объекта но только в опере). у меня проблема с тем что в ff не видно ob. и соответственно все его "методы". если уж решили помочь ссылкой на мануал, то будьте так любезны, вчитайтесь в первое сообщение и суть проблемы...

Kolyaj 18.10.2011 13:39

Обработчики событий так не назначаются, в дальнейшем ещё больше проблем оберёте. Если хотите, чтобы ваш скрипт заработал, будьте так любезны, прочитайте мануал и пишите правильно.

Никто не будет разбираться, почему не работает назначенный через жопу обработчик только потому, что вам лень прочитать, как надо правильно.

trololo 18.10.2011 17:09

извините за дерзость и может грубость. уже почти неделю гугл мучаю. ff меня не понимает ну никак. попробую объяснить ситуацию ещё раз. создаю userjs в котором код выглядит примерно следующим образом
var someObj={
ctor:function()
{
this.somemethod();
},
somemethod:function(){
document.getElementById('someid').setAttribute('onclick','someObj.action()'); // без разницы как я добавлял этот обработчик. будь то .onclick= или же .addEventListener( ... суть в другом
},
action:function(){alert('hello world!11');}
}
// в опере работает следующий вариант
window.load=someObj.ctor();
// в ff по клику на элемент someid c обработчиком onclick в котором вызывается action из someObj, ff (а точнее firebug) говорит что someObj не обявлен.

// пробовал так
var someVar=someObj;
window.load=someVar.ctor()
// в обработчике onclick всё того же элемента указывая на обявленую someVar вместо someObj, ситуация не изменилась - someVar is not defined блин...

// даже извращался так
var someScript=document.createElement('script');
someScript.type="text/javascript";
somwScript.innerHTML='var sss=someObj;window.load=sss.init();';
document.getElementsByTagName('head')[0].appendChild(someScript);
// в этом случае userjs не загружался вообще. кроме части где в шапку добавляется <script>

и это так не работает только если делать userjs, если же просто ставить весь этот код в страницу то работает даже просто через window.load=someObj.ctor();

Kolyaj 18.10.2011 17:16

Цитата:

Сообщение от trololo
// без разницы как я добавлял этот обработчик. будь то .onclick= или же .addEventListener( ... суть в другом

Должно работать, покажите, как вы делали.

trololo 18.10.2011 18:15

вот, только-что тестил
userjs который ставим через Greasemonkey
// ==UserScript==
// @name           someName
// @namespace      someFunctions
// @include        *
// ==/UserScript==
var someObj={
    ctor:function()
    {
        this.somemethod();
    },
    somemethod:function(){
        //document.getElementById('someid').setAttribute('onclick','someObj.action()');  // someObj is not defined
        //document.getElementById('someid').addEventListener('click','someObj.action',false); // ноль реакции, даже ошибок нет
        //document.getElementById('someid').onclick=someObj.action; // так же ноль реакции
        //document.getElementById('someid').onclick=function(){someObj.action();} // снова нет реакции. someObj.action также, и даже просто alert('test') как бы говорит о том что таким способом onclick не по вешать, хотя по фен-шую вроде.. 
        //document.getElementById('someid').onclick=someObj.action(); // не дожидаясь события onclick вызывается action сразу по загрузке документа. тут удивляться не приходится..
    },
    action:function(){alert('hello world!11');}
}
window.load=someObj.ctor();

страница на которой тестим
<html>
<head><title>some page</title>
</head>
<body>
<div id="someid">make some action</div>
</body>
</html>

trololo 18.10.2011 20:44

ff меня окончательно добил. это даже заслуга не ff а этого проклятого плагина greasemonkey скорее всего. секьюрность на высоте, да такая что прямо я в шоке. даже если делать так
function h()
{
document.getElementsByTagName('body')[0].innerHTML+='<script src="http://someserver.com/somescript.js"></script>';
}
window.onload=h();

ff его цепляет на страницу но вот не как js не выполняется. и даже так
function h()
{
document.getElementsByTagName('body')[0].innerHTML+='<script>alert("some text")</script>';
}
window.onload=h();

firebug показывает что в исходном коде оно есть. но alert не срабатывает..
------

вот так работает.
// ==UserScript==
// @name           someName
// @namespace      someFunctions
// @include        *
// ==/UserScript==
var someObj={
    ctor:function()
    {
	//alert(var_dump(this));
        this.somemethod();
    },
    somemethod:function(){
        document.getElementById('someid').setAttribute('onclick','someObj.action()');
	},
    myself:function(){
	var out = '';
	    for (var i in this) {
		out += i + ": " + this[i] + ',';
	    }
	return 'var someObj={'+out+'}; someObj.ctor();';
	},
    action:function(){alert('hello world!11');},
    create:function(){
	var someVar=document.createElement('script');
        someVar.innerHTML=this.myself();
        document.getElementsByTagName('body')[0].appendChild(someVar)
    }
}
window.onload=someObj.create();

шикарно? :D

trololo 20.10.2011 14:07

в общем проблема была в том что из dom нельзя было добраться до скрипта из greasemonkey. по-этому и ррешилась проблема копированием кода прямо в dom. в опере по умолчанию userjs располагаются в глобальном window а в ff нет. решение нужно было искать не на форуме о js а на форумах ff..
var w=(typeof unsafeWindow=='undefined')?window:unsafeWindow;
w.someObj=someObj;
w.addEventListener('load',function(){w.someObj.ctor()},false)

это скорее всего единственное правильное решение..


Часовой пояс GMT +3, время: 03:35.