2012-01-13 2 views
2

Я специально говорю о встроенном в IE сценарии языка PerlScript из ActiveState.Как создать кнопку HTML с действием и добавить его в DOM с помощью 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> 

ответ

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> 

Если мы запустим это, появится третья кнопка, но щелчок по ней ничего не сделает. Нам нужно сделать лишь небольшую корректировку, чтобы сделать эту работу в 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.

Надеюсь, что это поможет!

+1

+1 для чистой редкости опыта для PerlScript – daxim

+1

Дамиан, это был потрясающий ответ. Если бы я мог проголосовать несколько раз, я бы это сделал. Спасибо, что нашли время, чтобы объяснить это. Я думаю, что ошибка с добавлением «javascript:» в обработчике, вероятно, является причудой IE. –

+0

@MikeCaron Не беспокойтесь! Спасибо за благодарность! –