2011-03-24 1 views
1

이전에 수정 한 DOM 요소의 모든 속성을 열거해야합니다. 파이어 폭스, 크롬, 오페라로 할 수는 있지만 사파리로는 할 수 없었다. (나는 IE에 대해서는별로 신경 쓰지 않는다.)Safari에서 DOM 핸들러를 열거 할 수있게 만드는 방법은 무엇입니까?

<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에서 열거 할 수 없지만 어쨌든 열거됩니다!

delete link.onclick; 

을하지만 속성은 아직 사파리에 열거되지 않은 :

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

나는 그것을 할당하기 전에 onclick 속성을 삭제하여 크롬의 세 번째 alert 출력 true을 만들 수 있습니다.

난 ECMA 스크립트 5 개체 방법 defineProperty으로 시도 :

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

하지만 오류 반환 :

TypeError: defineProperty is not supported on DOM Objects

어떤 제안?

P. Safari는 Webkit을 기반으로하지만 Chrome과 다른 점은 무엇입니까?

+2

PS에 대한 답변 : Webkit은 렌더링 엔진입니다. Javascript의 경우 Safari는 JavaScriptCore 엔진 (Squirrelfish)을 사용하고 Chrome은 V8을 사용합니다. – Martijn

답변

0

useragentWebkit JavaScriptCore에 EcmaScript5 개체 메서드가 구현 된 Webkit 버전을 비교하십시오. Chrome의 Webkit 버전은 Safari의 Webkit 버전과 다르므로 표준 지원은 이에 따라 달라집니다.