Это очень трудно достичь, по-видимому.Браузер (в моем случае 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>
Если мы запустим это, появится третья кнопка, но нажатие на нее ничего не даст.Нам нужно сделать лишь незначительную корректировку, чтобы эта работа работала в 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");
}
На самом деле, это немного хуже, потому что теперь, если вы используете свой любимый HTML-отладчик для проверки элемента 3, у вас вообще нет обработчика onclick
.Итак, что мы можем сделать, чтобы обойти это?Что ж, ответ на самом деле довольно прост - не используйте 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>
Кажется, это хорошо работает, хотя я не уверен, насколько хорошо он впишется в ваш вариант использования.Конечно, в этом коде есть одна странная вещь: обработчики onclick
для каждого из элементов input
явно указывают, что он вызывает функцию JavaScript.Очевидно, что это не так, поскольку эти функции на самом деле являются подпрограммами PerlScript.Однако, если вы удалите префикс javascript:
, обработчики никогда не будут вызываться.Я думаю, что это еще больше подчеркивает склонность браузера к JavaScript.
Надеюсь, это поможет!