2016-08-10 5 views
3

私たちはアプリケーションでフレームを使用しています。 1つのフレームでは、スクロールは"auto"に設定されています。小さな条件に基づいてそのフレーム属性を変更しようとしています。ここではHTMLとJavaScriptで:変更<frameset> JavaScriptでスクロール

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="x-ua-compatible" content="IE=5"> 
    </head> 
    <frameset> 
     <frame src="#" name="contentFR" id="contentFR" scrolling="Auto" noresize marginwidth="0" marginheight="0"> 
    </frameset> 
    <script language="javascript"> 
     var iFrm = document.getElementById("contentFR"); 
     iFrm.setAttribute('scrolling', 'no'); 
    </script> 
</html> 

私はIE 11を使用しています、しかし、私のアプリケーションは、IE 5互換モードで実行することができます。

+0

上記のコードに誤字がありますか。 getElementById'と '(')の間には空白を入れてはいけません。また、あなたは期待していないことをしています;属性は変更されませんか? 'iFrm.getAttribute(" scrolling ")' – Sampson

+0

申し訳ありませんが、私のコードではスペースがありません – fabolous

+0

"私のアプリケーションはIE 5互換モードでのみ動作します"と言われると、それはあなたの*ターゲット*ドキュメントモード、今のところ唯一のものですか?現代版のIEや古いバージョンでこれを動作させたいのですか? – Sampson

答えて

3

更新アプローチ:ノードを複製するだけです。

// Proceed when the document has loaded 
var timer = setInterval(function() { 
    // The document has loaded 
    if (document.readyState === "complete") { 
     // Stop checking document load-state 
     clearInterval(timer); 
     // Get our frame, and create a clone of it 
     var frame = document.getElementById("contentFR"); 
     var clone = frame.cloneNode(true); 
     // Update the scrolling on the clone 
     clone.setAttribute("scrolling", "no"); 
     // Replace original frame with clone frame 
     frame.parentElement.replaceChild(clone, frame); 
    } 
}, 10); 

このルートが選択された理由については、以下を参照してください。


プロパティや属性を変更しても機能しないとうんざりです。確かに、私はWindows 10上のInternet Explorer 11からしかチェックできないので、Internet Explorerの以前のビルドで同じ問題が再現されることはわかりません。あなたのユーザーはInternet Explorer 11に入っていると言われているので、問題が発生した場合でもそうなるでしょう。

私はまた、フレームセットの下<script>を配置することはどちらか動作しないことがわかったので、私は<head>に配置する(スクリプトのみ<body>または<head>内に配置することができていたが、この中に何<body>がないので書類は、<head>にしか置くことができません)。頭部は最初に解析/作成されるので、私たちのフレーム要素は頭からそれを変更する時間内には存在しません。また、IE 5のドキュメントモードを使用しているため、documentDOMContentLoadedイベントでは再生できません。代わりに、として登録されるまで、document.readyStateの値を10msごとにチェックしました。

最後に、あなたが見つけたように、属性を更新するだけでは機能しないようです。プロパティの設定も機能していません。奇妙なことに、操作を実行した後で要素を検査すると、これらの両方が実際に値からからに変更されますが、変更はドキュメントに反映されません。このため、新しいフレームを作り直すことにしました。

このコードは本当に間違っていると感じています。誰かが一緒に来て、基本的に要素を複製し、一方の属性を他方の要素に適用するという極端な方法を必要としないアプローチを共有することを望みます。それまでは、この解決法が有効です。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="x-ua-compatible" content="IE=5"> 
     <script type="text/javascript"> 
      // Proceed when the document has loaded 
      var timer = setInterval(function() { 
       if (document.readyState === "complete") { 
        // Stop checking document load-state 
        clearInterval(timer); 
        // Get our frame, and create a replacement 
        var frame = document.getElementById("contentFR"); 
        var newFrame = document.createElement("frame"); 
        // Copy all attributes over 
        var i = 0, attr; 
        for (; i < frame.attributes.length; i++) { 
         attr = frame.attributes[i]; 
         // If we found a scrolling attribute, set it to 'no' 
         if (attr.name === "scrolling") attr.value = "no"; 
         // Apply old attribute to new frame 
         newFrame.setAttribute(attr.name, attr.value); 
        } 
        // Replace old frame with new frame 
        frame.parentElement.replaceChild(newFrame, frame); 
        // Null-out our variables 
        frame = i = attr = timer = null; 
       } 
      }, 10); 
     </script> 
    </head> 
    <frameset cols="50%, *"> 
     <frame src="side.html"> 
     <frame src="page.html" id="contentFR" scrolling="Auto" noresize marginWidth="0" marginHeight="0"> 
    </frameset> 
</html> 
+1

非常によく説明されています。ありがとうございました – fabolous

+0

助けてくれてうれしく思います。この回答があなたの質問に答えた場合は、他人の利益のためにそれを受け入れることを検討してください。 – Sampson

関連する問題