2012-01-02 7 views
1

FireFox 및 Opera에서 오류가 발생했습니다. (데비안 Whezee, Firefox 9.0.1, Opera 11.60, Chrome 16.0.912.63) 다음과 같이 입력하면 :HTMLElement.toString()은 Chrome에서만 작동

이 같은 "[객체는 HTMLElement] 세계"를 얻을이 예상대로

var a = document.createElement('a') 
a.toString = function(){ return "Hello" } 
alert(a+" World"); 

크롬에서 당신은 "안녕하세요"로 경고 상자를 얻을 것이다,하지만, 파이어 폭스와 오페라 (IE에 대해 알고하지 않습니다)

이 문제를 해결하기 위해 노력한 내용 :

Object.prototype.toString = function(){ return "Hello" }; 
Function.prototype.toString = function(){ return "Hello" }; 
(210)

DOM 요소 객체되지 않습니다 (객체 및 그 기능에서 상속하지 않음) 때문에 그것은 작동하지 않습니다 심지어이 도움이되지 않았다 :

HTMLElement.prototype.toString = function(){ return "Hello" }; 
Element.prototype.toString = function(){ return "Hello" }; 
Node.prototype.toString = function(){ return "Hello" }; 

는 HTMLElement, 요소, 노드는 모든 인터페이스이기 때문에와 기능이 아닙니다.

내 질문에이 오류를 어디에서보고 할 것입니까? 누군가 이걸로 나를 도울 수 있습니까?

// 편집

이 내 원래의 toString 기능입니다 : 당신이 볼 수 있듯이

var a = document.createElement('a'); 
a.toString = function(){ 
    var tmp=document.createElement('div'); 
    tmp.appendChild(this); 
    return tmp.innerHTML; 
} 

가 outerHTML에 대안 내가 라인을

다음의 기본 동작으로이 필요
document.getElemntById('someID').innerHTML += "click this link:"+a; 

결과는 다음과 같아야합니다.

<div id='someID'>click this link:<a></a></div> 
+0

누가 실수라고 말합니까? 분명히 파이어 폭스와 오페라는 DOM 노드의'toString'을 오버 라이딩 할 수 없다. 호스트 객체이기 때문에 ECMAScript 사양을 따르지 않으므로 완벽합니다. –

+0

어쩌면 누군가가 비슷한 효과를 내기 위해 무엇을 할 수 있는지 알고 있습니다. 그 트릭을 수행 할 수있는 다른 방법을 오버라이드 할 수 있습니까? 매번 a.toString()을 사용하면 Chrome을 사용하고 다른 사용자가 Firefox 또는 Opera를 사용할 때 그다지 분명하지 않기 때문입니다. 나는 보통 "이상하게, 내 작품은 잘했다"고 말한 다음 필요하다면 .toString()을 자동으로 추가합니다. – fon60

+1

질문은, 당신의'toString' 함수가 정확히 무엇을하기를 원합니까? 내부 텍스트를 얻고 싶다면'innerText' 나'textContent'를 사용해야합니다. 그것이 표준 방법입니다. –

답변

1

DOM 요소에 toString을 호출하면 표준 동작이 아니므로보고 할 곳이 없다고 생각합니다. innerHTML을 사용해야하는 요소에서 html 콘텐츠를 가져오고 텍스트 콘텐츠 만 가져 오려면 textContent (또는 이전 IE 브라우저의 경우 innerText)

+0

내 .toString 함수는 다음과 같습니다. – fon60

+0

죄송합니다. 답변을 시작했지만 원래 질문을 수정하고이 주석을 삭제하지 않았습니다. – fon60

0

언제든지 사용자의 기본/기본 동작을 변경하려고 할 때 계획; 거의 항상 불량 아이디어입니다.

var aa = document.createElement('a'); 
document.body.appendChild(aa); 
var nodeList = document.getElementsByClassName('*'); 
for (var i = 0, len = nodeList.length; i < len; i ++) { 
    nodeList[i].myCustomFunction = toStringOverride; 
} 
function toStringOverride() { 
    return "Hello "; 
} 

alert(aa.myCustomFunction() + " World"); 
+0

특정 매개 변수가 문자열이 될 것으로 기대하는 많은 함수가 있지만 HTML UI 요소 일 수있는 새로운 요구 사항이있는 경우에 유용 할 수 있습니다 (이 경우 HTML 요소를 사용할 수 있습니다. 요소의 값). 이제 모든 함수에 체크/변환을 명시 적으로 추가해야하지만, 이미 문자열로 변환중인 경우 전달하려는 각 요소에서'toString'을 재정의해야합니다. – Michael

0

Array 객체를 덮어 쓸 수 toString이 있지만, DOM 요소는이

Array이없는 이유 네이티브 자바 스크립트 객체는 다음과 같습니다 제가 제안 할 수 같아요. ECMAScript 표준은 다른 toString을 프로토 타입에 해킹하는 기능을 포함하여 JS 객체의 작동 방식에 대한 요구 사항을 제시합니다.

그러나 DOM 개체는 native-JS 개체이거나 JS 개체의 일반적인 동작 규칙을 따르는 데 지정되지 않습니다. 그것들은 표준이 '호스트 객체'라고 부르는 것일 수 있습니다.

프로토 타입을 해킹하는 것은 매우 신뢰할 만하며 전혀 좋은 생각이 아닙니다. 하나의 JS 라이브러리 prototype.js가 시도되었고 그 결과는 messy입니다.

노드가 객체를 상속 받도록하십시오. 제발

죄송합니다, Stack Overflow에는 Node이 기본 JavaScript 객체이어야 할 권한이 없습니다!

DOM의 네이티브 JS 객체를 표준화하도록 모든 브라우저 공급 업체를 설득 할 수있을 때까지 외부 function Node_getOuterHTML(node) { ... }을 사용해야하고이를 명시 적으로 "click this link:"+Node_getOuterHTML(a)이라고해야합니다.

일반적으로 생성 한 노드를 innerHTML을 사용하는 DOM-> HTML- 마크 업 -> DOM serialise-and-parse주기를 통해 보내지 않고 직접 문서에 추가하는 것이 좋습니다.

+0

DOM에 대한 "네이티브"(또는보다 정확하게 "비 프록시") JS 객체를 표준화 할 확률은 정확히 0입니다. 왜냐하면 web compat에는 원시 객체가 단순히 스펙 당 가질 수없는 DOM의 동작이 필요하기 때문입니다. DOM에있는 많은 것들이 원시 객체 일 수 있지만 많은 다른 것들은 불가능합니다. –

관련 문제