【问题标题】:javascript how to run the same function onLoad and onChangejavascript如何运行相同的函数onLoad和onChange
【发布时间】:2012-04-11 17:16:58
【问题描述】:

我有一个包含许多选择菜单的表单,其中大多数是是/否,并且根据所选选项,我会显示/隐藏一些高级选项。选择菜单之一如下:

<td><%= f.select :CBIAvailable, ['Yes' , 'No'],{}, {:id=>"cbi_available_id", :class=>"cbi_available_class", :onChange=>"showHideOptions('cbi_available_id','cbi_options_id')", :onLoad=>"showHideOptions('cbi_available_id','cbi_options_id')"} %></td>

当我从“是”更改为“否”或相反时,会正确调用 showHideOptions javascript 函数,但是当我重新加载表单时无法调用该函数。

谁能告诉我我做错了什么?

谢谢

更新

<script language="javascript" type="text/javascript">
function showHideOptions(selectorId,optionsId) {
  if (document.getElementById) {
    var selector = document.getElementById(selectorId);
    var options = document.getElementById(optionsId);
    if (selector.value == 'Yes') {
        options.style.display = 'block';
        return false;
    } else {
      options.style.display = 'none';
        return false;
    }
}

window.onLoad = showHideOptions('cbi_available_id','cbi_options_id');

【问题讨论】:

  • 我不明白。 Onload 在(重新)加载表单时被调用。你期待什么?
  • 在我的情况下,:CBIAvailable = 'No',所以我希望 showHideOptions 函数在我重新加载表单时执行,它应该显示“No”的相关选项,但实际上表单重新加载“是”的选项。当我将选择菜单更改为“否”时,它可以正常工作,当我将其更改回“否”时,它也可以正常工作。问题是它没有显示正确的加载选项

标签: javascript forms select onload onchange


【解决方案1】:
function yourFunction(){

    //get that select element and evaluate value
    //do you change stuff here
}

window.onload = yourFunction;   //this gets fired on load

//"select" is your element, 
//fetched by methods like document.getElementById();

select.onchange = yourFunction; //this gets fired on change

//you can also use attachEvent (IE) or addEventListener (Others)

这里是a working demo

<select id="testSelect">
    <option value="yes">YES</option>
    <option value="no">NO</option>
</select>​​​​​

function getOption() {
    alert('foo');
}

var select = document.getElementById('testSelect');
select.onchange = getOption;
window.onload = getOption;

【讨论】:

  • 谢谢约瑟夫。我用您提出的更改更新了我上面的问题,但是当我重新加载表单时它仍然无法正常工作。当我将所选选项从“是”更改为“否”以及相反时,它确实可以正常工作。
  • 还是不行。事实上,使用原始语法,该函数确实会触发 onload(我通过在函数内添加一个 document.wrtie 进行了测试)但它不会像我选择“是”或“否”时那样执行其余的操作
  • 感谢约瑟夫的努力。非常感激。您的演示确实有效,这就是我希望我的脚本工作的方式,但我上面的 if (selector.value == 'Yes') 测试仍然失败 onLoad,即使它在 onChange 上运行良好
  • 我添加了 alert(selectorId);alert(selector.value);在我的脚本开始时,它们都触发了 onChange,但只有第一个触发了 onLoad。很奇怪!
  • 我终于想出了如何解决我的问题。我不得不将 window.onload 行放在文件底部的 部分中,在表单之后。我猜想 window.onload 是在表单加载后执行的,因此可以正常工作。当 window.onload 位于文件顶部的 部分时,document.getElementById(selectorId) 指向 null,因此没有可测试的值。
【解决方案2】:

当您从远程服务器收到回发并且您的响应没有&lt;script type="javascript"&gt;... yourfunction()...&lt;/script&gt; 时,可能会发生这种情况。

每次收到新响应时,您都应该发送脚本并执行它或附加到您的 html 元素相应的事件处理程序。

另一种解决方案是使用 jQuery 并使用 .live() 事件。此事件将动态行为附加到您的 html。 我强烈建议您在 live 中使用 jQuery,因为这个库是生产环境中最常用的库之一。

编辑

<script type="text/javascript" src="path_to_jquery.js"></script>
<script type="text/javascript">
function showHideOptions(id1,id2){
    //Your code
}
$(document).ready(function() {
   //This function waits for DOM load
   //execute your function for first time
   showHideOptions('cbi_available_id','cbi_options_id');
   //This selector you have to modify or show us generated html to
   // choose the best selector for this purpose
   $('.cbi_available_class').live('change',function(){
        //This will fire change event of html class="cbi_available_class"
        showHideOptions('cbi_available_id','cbi_options_id');
   });
 });
</script>

【讨论】:

  • 感谢 r.piesnikowski。我确实有 您能否提供一个使用 /live() 的示例 jQuery 脚本?
  • 请注意,Jquery live() 在 JQuery 1.7 中已弃用并从 1.9 中删除
最近更新 更多