2012-01-02 3 views
1

FireFoxとOperaでエラーが発生しました(私はDebian Whezee、Firefox 9.0.1、Opera 11.60、Chrome 16.0.912.63を実行しています) :Chromeの場合HTMLElement.toString()はChromeでのみ動作します

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

あなたが期待どおりには「Hello World」ので警告ボックスを取得しますが、Firefoxとオペラ(IEのことは知らない)で、あなたはこの「[オブジェクトのHTMLElement]世界」のような何かを得る

私はこれを解決しようとしました:

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

DOM要素が対象でない(オブジェクトとそのための機能を継承していない)ので、それが動作しないとさえこれは助けにはならなかった。

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

のHTMLElement、要素、ノードは、すべてのインターフェイスであるためと機能ではありません。

ここで私の質問は、この間違いを報告する場所ですか?誰かがこれで私を助けることができますか?

//編集

これが私の元のtoString関数です:あなたは、これがouterHTMLに代わるものであると私はライン

を以下にデフォルトの動作として、これを必要と見ることができるように

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

document.getElemntById('someID').innerHTML += "click this link:"+a; 

結果は次のようになります。

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

誰が間違いだと言っていますか?どうやら、FirefoxとOperaはDOMノードの 'toString'をオーバーライドすることはできません。それらはホストオブジェクトなので、ECMAScript仕様の対象ではないため、完璧です。 –

+0

だから、誰かが私が何をして同様の効果を得ることができるかを知っているかもしれない。そのトリックを行うことをオーバーライドする他の方法はありますか?なぜなら、私がChromeを使用していて、他の人がFirefoxやOperaを使用しているときには、毎回a.toString()を使用することは明らかではないからです。私は通常、「奇妙な、私の作品は大丈夫です」と言い、必要に応じて.toString()を静かに追加します。 – fon60

+1

質問は、あなたの 'toString'関数が何をしたいのですか?本当に内側のテキストだけを取得したい場合は、 'innerText'または' textContent'を使用してください。それが標準的な方法です。 –

答えて

1

DOM要素のtoStringを呼び出すのが標準的な動作ではないので、これを報告する場所はありません。 innerHTMLを使用してテキストコンテンツだけを取得するはずの要素からhtmlコンテンツを取得するにはtextContent(または古いIEブラウザの場合はinnerText)

+0

my .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要素でもよいという新しい要件がある場合(この場合、要素の値)。これで、すべての関数にチェック/変換を明示的に追加する必要があります。すでに文字列に変換している場合は、渡す各要素で 'toString'をオーバーライドするだけです。 – Michael

0

Arrayオブジェクトを上書きできるのtoStringを持っていますが、DOM要素がこの

Arrayを持っていない理由をネイティブJavaScriptオブジェクトは、次のとおりです。私は、私はお勧めかもしれませんね。 ECMAScript標準は、異なるtoStringをプロトタイプにハッキングする機能を含め、JSオブジェクトの仕組みの要件を定めています。

しかし、DOMオブジェクトは、ネイティブJSオブジェクトであるか、JSオブジェクトの一般的な動作ルールに従うように指定されていません。彼らは、標準が 'ホストオブジェクト'と呼ぶものであることは許されています。

プロトタイプをハッキングすることは非常に信頼性が低く、良い考えではありません。 1つのJSライブラリprototype.jsが試行され、結果はmessyでした。

ノードにオブジェクトを継承させるようにしてください。してください

申し訳ありません、スタックオーバーフローは、NodeがネイティブJavaScriptオブジェクトであることを要求する権限がありません!

DOMのネイティブJSオブジェクトを標準化するようにすべてのブラウザベンダーを説得するまで、外部function Node_getOuterHTML(node) { ... }を使用して明示的に"click this link:"+Node_getOuterHTML(a)と呼ぶ必要があります。

作成したノードを文書に直接追加するのではなく、DOM-> HTML-markup-> DOM serialise-and-parseサイクル(innerHTML)で直接送信するのではなく、

+0

web compatは、ネイティブオブジェクトが単に仕様に従って持つことができないDOMからの動作を必要とするため、DOMの "ネイティブ"(より正確には "非プロキシ")JSオブジェクトを標準化する可能性は、正確に0です。 DOMの中の多くのものはネイティブオブジェクトですが、他の多くのものはできません。 –

関連する問題