1

新しい画面で開くpdfファイルへのリンクがいくつかあるWebページがあります。リンクの 1 つをクリックすると、新しいページが正常に開きます。そのページが開いているときに別のリンクをクリックすると、ページが新しいページに置き換えられますが、「メンバーが見つかりません」というJSエラーがスローされます

HTML:

helpMenu.add( new AnchorMenuItem("User Guide", "javascript:openHelpWindow('../html/help/user_guide.html');") );
helpMenu.add( new AnchorMenuItem("FAQ", "javascript:openHelpWindow('../html/help/faq.html');") );
helpMenu.add( new AnchorMenuItem("Features", "javascript:openHelpWindow('../html/help/features.html');") );
helpMenu.add( new AnchorMenuItem("Overview", "javascript:openHelpWindow('../doc/Overview.pdf');") );
helpMenu.add( new AnchorMenuItem("Actual Info Guide", "javascript:openHelpWindow('../doc/ActualInfoGuide.pdf');") );

JS

/**
* Function to open the pop-up windows that the radio button
 * or select box options will be chosen from.
 */
function openHelpWindow(url)
{
    var w;
    if (isBrowserNetscape)
    {
        // Netscape
        w = window.open(url, "MSSTHelp", "resizable=yes, scrollbars=yes, menubar=no, location=no, toolbar=no, height=700, width=900, screenX=100, screenY=100");
    }
    else
    {
        // IE
        w = window.open(url, "MSSTHelp", "resizable=yes, scrollbars=yes, menubar=no, location=no, toolbar=no, height=700, width=900, left=100, top=100");
    }
    w.focus();
}

エラーはw.focus();

4

2 に答える 2

2

恐ろしく古いコード。また、parms 内のスペースが原因で、それが作成されたブラウザーで失敗した可能性があります。これがドキュメンテーションwindow.open ベスト プラクティス です 上/左と screenX、screenY を区別する必要はありません - 後者は Netscape 4 以前であり、パラメータを無視するため、他のブラウザも必要に応じて指定できます彼らは必要ありません。parm=no は削除でき、parm=yes は parm として設定できます。

シンプルバージョン:

function openHelpWindow(url) {
   var w = window.open(url, "MSSTHelp", 
       "resizable,scrollbars,height=700,width=900,screenX=100,screenY=100,left=100,top=100");
   if (w) w.focus();
}

上記のドキュメントに従って、すでに開いているウィンドウを再利用する

var w; // global var
function openHelpWindow(url) {
   if (!w || w.closed) {
     w = window.open(url, "MSSTHelp",
        "resizable,scrollbars,height=700,width=900,screenX=100,screenY=100,left=100,top=100");
   }
   else {
     w.location=url; // OR window.open(url, "MSSTHelp"); 
   }
   if (w) w.focus();
}
于 2012-10-11T17:33:17.293 に答える
0

これは、「w」変数のスコープが、宣言した関数内にあるためです。

次の呼び出しでアクセスできるようにするには、関数の外で w var を宣言する必要があります。関数を呼び出すと、window.open() で作成したウィンドウへの参照を貼り付ける "w" という関数の / 内部 / に新しいボックスが作成されます。次に、関数の実行が終了すると、その "w" が破棄されます。関数のスコープ外で "w" を宣言するのは /better/ ですが、それでも問題が生じる可能性があります (現在はグローバル スコープにいるため)。

var w = null;
/**
* Function to open the pop-up windows that the radio button
* or select box options will be chosen from.
*/
function openHelpWindow(url)
{
    if (isBrowserNetscape)
    {
        // Netscape
        w = window.open(url, "MSSTHelp", "resizable=yes, scrollbars=yes, menubar=no, location=no, toolbar=no, height=700, width=900, screenX=100, screenY=100");
    }
    else
    {
        // IE
        w = window.open(url, "MSSTHelp", "resizable=yes, scrollbars=yes, menubar=no, location=no, toolbar=no, height=700, width=900, left=100, top=100");
    }
    w.focus();
}

ウィンドウがまだ開いているかのように、最初に開いたウィンドウに新しいURLに移動するように指示するだけで、呼び出しごとにウィンドウ全体の再構築が強制されるため、これでも非常に効率的ではありません。

var w = null;
/**
* Function to open the pop-up windows that the radio button
* or select box options will be chosen from.
*/
function openHelpWindow(url)
{
    if(w == null){
        if (isBrowserNetscape)
        {
            // Netscape
            w = window.open(url, "MSSTHelp", "resizable=yes, scrollbars=yes, menubar=no, location=no, toolbar=no, height=700, width=900, screenX=100, screenY=100");
        }
        else
        {
            // IE
            w = window.open(url, "MSSTHelp", "resizable=yes, scrollbars=yes, menubar=no, location=no, toolbar=no, height=700, width=900, left=100, top=100");
        }
    } else {
        w.document.location(url);
        w.focus();
    }
}

まだ効率的ではありません!コードの重複をすべて見てください。

var w = null;
/**
* Function to open the pop-up windows that the radio button
* or select box options will be chosen from.
*/
function openHelpWindow(url)
{
    if(w == null){
        var winSpecs = "resizable=yes,scrollbars=yes,menubar=no," 
                     + "location=no,toolbar=no,height=700,width=900,"
                     + (isBrowserNetscape) ? "screenX=100,screenY=100" : "left=100,top=100";
        w = window.open(url, "MSSTHelp", winSpecs);
    } else {
        w.location(url);
        w.focus();
    }
}

さて、このリファクタリングされたコードでも問題があることに注意してください... Netscape 以外のすべてのブラウザーは、このようなウィンドウを開くときに「左」と「上」を使用することを確認しますか? さらに、使いやすさの問題や、コードの機能を妨げる可能性のあるブラウザー ベースのポップアップ ブロッカーもあります。

于 2012-10-11T17:39:17.090 に答える