Как сделать обработчик DOM перечисляемым в Safari? - PullRequest
1 голос
/ 24 марта 2011

Мне нужно перечислить все свойства моих элементов DOM, которые я ранее модифицировал.Я мог сделать это с Firefox, Chrome и Opera, но я не мог с Safari (меня сейчас не волнует IE).

<a id="link">Link...</a>
<script>
    var link = document.getElementById("link");
    var foo = function (baz) {};
    link.onclick = foo;
    alert ("onclick" in link); // true
    alert (link.hasOwnProperty("onclick")); // true
    alert (link.propertyIsEnumerable("onclick")); 
    // false with Chrome, Safari, Opera*
</script>

*: хотя свойство в Opera не перечисляемо, оно в любом случае перечисляется !!!

for (p in link) 
    if (p==="onclick") 
        alert (p); // onclick

Я могу сделать третий alert вывод true в Chrome с помощьюудаление свойства onclick перед его назначением:

delete link.onclick;

Но свойство еще не перечислено в Safari.

Я даже пытался использовать метод EcmaScript 5 Object defineProperty :

Object.defineProperty (link, onclick, {
    value: foo,
    enumerable: true,
    configurable: true,
    writable: true
});

, но он возвращает ошибку:

TypeError: definePropertyне поддерживается в объектах DOM

Есть предложения?

PS Почему Safari отличается от Chrome, хотя оба они основаны на Webkit?

1 Ответ

0 голосов
/ 29 августа 2012

Сравните useragent с версией Webkit, в которой методы объекта EcmaScript5 были реализованы в Webkit JavaScriptCore . Версия Chrome для Webkit отличается от версии Safari, поэтому поддержка стандартов будет меняться соответственно.

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