2

私は特にActiveStateのIE組み込みスクリプト言語「PerlScript」について話しています。

現在、次のものがありますが、ボタン3を押しても何も起こりません。

<html>
    <head>
        <title>perlscript baby!</title>
    </head>

    <script language="perlscript" event="onload" for="window">
        sub yawn
        {
            $window->alert("hi!");
        }
        sub createNew
        {
            $b = $window->document->createElement('button');
            $b->{value} = "button 3";
            $b->{onclick} = "yawn()";
            $window->alert("Button: " . $b->{outerHTML});
            $window->document->body->appendChild($b);
        }
        sub enable
        {
            undef $window->document->all('buttn 2')->{disabled};
        }
    </script>

   <body>
       <input id='enabler' type='button' value='button 1' onclick='enable()'></input>
       <input id='action' type='button' value='button 2' disabled onclick="createNew()"></input>
   </body>
</html>
4

1 に答える 1

3

どうやら、これを達成するのは非常に難しいことです。ブラウザ(私の場合はIE9)は、onclick属性の値(スクリプトから設定された場合)が文字列ではなく関数参照であることを期待しています。以下に示すように、コードを同等のJavaScriptに変換することで、これを証明できます。

<script language="javascript">
    function yawn()
    {
        window.alert("hi!");
    }
    function createNew()
    {
        b = window.document.createElement('button');
        b.value = "button 3";
        b.onclick = "yawn()";
        window.alert("Button: " + b.outerHTML);
        window.document.body.appendChild(b);
    }
    function enable()
    {
        window.document.getElementById("action").removeAttribute("disabled");
    }
 </script>

これを実行すると、3番目のボタンが表示されますが、クリックしても何も起こりません。これをJavaScriptで機能させるには、わずかな調整を行うだけで済みます。

function createNew()
{
    // ...
    b.onclick = function() { yawn(); };
    // ...
}

これを同等のperlscriptに戻すと、まだ機能しないことがわかります。

sub yawn
{
    $window->alert("hi!");
}
sub createNew
{
    $b = $window->document->createElement('button');
    $b->{value} = "button 3";
    $b->{onclick} = sub { $window->yawn(); };
    $window->alert("Button: " . $b->{outerHTML});
    $window->document->body->appendChild($b);
}
sub enable
{
    $window->document->getElementById("action")->removeAttribute("disabled");
}

onclick実際、ボタン3要素を検査するためにお気に入りのHTMLデバッガーを使用する場合、ハンドラーがまったくないため、少し悪化します。では、これを回避するために何ができるでしょうか。答えは実際には非常に単純です。PerlScriptを使用して要素を動的に作成するのではなく、静的に作成し、PerlScriptを使用して非表示および表示します。

<html>
    <head>
        <title>perlscript baby!</title>
    </head>
    <script language="perlscript">
        sub yawn
        {
            $window->alert("hi!");
        }
        sub createNew
        {
            $window->document->getElementById('button3')->style->{display} = "inline";
        }
        sub enable
        {
            $window->document->getElementById("action")->removeAttribute('disabled');
        }
    </script>
    <body>

        <input id='enabler' type='button' value='button 1'
            onclick='javascript:enable();' />

        <input id='action' type='button' value='button 2' disabled
            onclick='javascript:createNew();' />

        <input id='button3' type='button' value='button 3' style='display:none;'
            onclick='javascript:yawn();'/>

    </body>
</html>

これはうまく機能しているようですが、ユースケースにどれだけうまく適合するかはわかりません。もちろん、このコードには非常に奇妙なことが1つありonclickます。各input要素のハンドラーは、JavaScript関数を呼び出していることを明示的に示しています。これらの関数は実際にはPerlScriptサブルーチンであるため、これは明らかに真実ではありません。ただし、javascript:プレフィックスを削除すると、ハンドラーが呼び出されることはありません。これは、JavaScriptに対するブラウザの偏見をさらに浮き彫りにしていると思います。

お役に立てば幸いです。

于 2012-06-08T20:03:54.767 に答える