Javascript глобальный объект вызывает функцию? - PullRequest
1 голос
/ 31 декабря 2010

У меня очень странная проблема с JavaScript.Мой код довольно длинный, поэтому вот пример структуры и проблемы:

var x = new function f() {
    this.id = "";
}

function g(obj) {
    if (x.id == "") {
        ...
        obj.firstChild.setAttribute("onclick", "javascript:o();");
        ...
        x.id = obj.id;
    } else if (x.id != obj.id) {
        ...
        x.id = "";
        g(obj);
    }
}

function o() {...
    if (something == something) {
        ...
    } else {
        ...
        x.id = ""; // if-statement of the g() function is called here?
    }
}

Как видите, оператор if функции g () по какой-то причине вызывается или перезапускаетсяпосле изменения x.id.Я просто не могу этого понять, потому что они не находятся в одной области, и изменение переменной ни в коем случае не должно вызывать ничего?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 31 декабря 2010

x.id = ""; // if-statement of the g() function is called here?

Если код действительно такой, как вы его показываете, эта строка кода не будет генерировать вызов функции.Строка - это просто присвоение свойству id x.Единственный способ вызвать вызов функции, если вы присвоите свойству id значение x, - это если бы вы использовали браузер, который поддерживал методы доступа к свойствам (геттеры и сеттеры), что очень маловероятно (и в вашем ничего неткод делает это).

Казалось бы, что-то еще вызывает g в цикле некоторого вида, и поэтому при изменении значения следующий вызов g увидит изменение.Как отметил Джонатон в своем комментарии к этому вопросу, это может быть что-то, что вы настроили с помощью setTimeout, или setInterval, или в четном обработчике (например, при перемещении мыши) и т. Д., Но это ничегов указанном коде.


Возможно, не по теме:

У вас есть строка кода с самого начала:

var x = new function f() {
    this.id = "";
}

Этот код использует «выражение именованной функции», которое должно быть допустимым, но вызывает проблемы в некоторых реализациях (например, IE).Разделите его, чтобы получить желаемый результат в кросс-браузерном режиме:

var x = new f();
function f() {
    this.id = "";
}

Не по теме :

Вы не используете javascript:псевдопротокольный протокол, за исключением атрибутов, которые принимают URI (например, href для a элементов).Атрибут onclick не принимает URI, он принимает код JavaScript, поэтому измените:

obj.firstChild.setAttribute("onclick", "javascript:o();");

на

obj.firstChild.setAttribute("onclick", "o();");

Но , еще лучше, назначьтенепосредственно обработчик:

obj.firstChild.onclick = o;

... или даже подумайте об использовании addEventListener или его IE-аналога attachEvent вместо.

0 голосов
/ 31 декабря 2010

Большое спасибо за ваши ответы.Теперь я понял проблему.Функция g () вызывается всякий раз, когда щелкает определенный объект tableRow.Эта та же таблица строк содержит объект obj.firstChild.Из-за этого, когда я нажимаю на obj.firstChild, выполняются o () и g ().

Теперь я должен выяснить, как можно предотвратить вызов g () при вызове obj.firsChildнажата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...