我正在使用jQuery在更改/点击单选按钮组时隐藏和显示元素。它在Firefox等浏览器中运行良好,但在IE 6和7中,仅当用户点击页面上的其他位置时才会执行操作。
详细说明,当你加载页面时,一切看起来都很好。在Firefox中,如果单击单选按钮,则会隐藏一个表行,并立即显示另一个表行。但是,在IE 6和7中,您单击单选按钮,在您单击页面上的某个位置之前不会发生任何事情。只有这样,IE才会重绘页面,隐藏并显示相关元素。
这是我正在使用的jQuery:
$(document).ready(function () {
$(".hiddenOnLoad").hide();
$("#viewByOrg").change(function () {
$(".visibleOnLoad").show();
$(".hiddenOnLoad").hide();
});
$("#viewByProduct").change(function () {
$(".visibleOnLoad").hide();
$(".hiddenOnLoad").show();
});
});
这是它影响的XHTML的一部分。整个页面验证为XHTML 1.0 Strict。
<tr>
<td>View by:</td>
<td>
<p>
<input type="radio" name="viewBy" id="viewByOrg" value="organisation"
checked="checked" />Organisation</p>
<p>
<input type="radio" name="viewBy" id="viewByProduct" value="product" />Product</p>
</td>
</tr>
<tr class="visibleOnLoad">
<td>Organisation:</td>
<td>
<select name="organisation" id="organisation" multiple="multiple" size="10">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</select>
</td>
</tr>
<tr class="hiddenOnLoad">
<td>Product:</td>
<td>
<select name="product" id="product" multiple="multiple" size="10">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</select>
</td>
</tr>
如果有人有任何想法,为什么会发生这种情况以及如何解决,他们将非常感激!
答案 0 :(得分:96)
答案 1 :(得分:54)
使用click
事件代替change
的问题是,如果选择了相同的单选框(即实际上没有更改),则会收到该事件。如果您检查新值是否与旧值不同,则可以将其过滤掉。我发现这有点烦人。
如果您使用change
事件,您可能会注意到在您单击IE中的任何其他元素后它将识别更改。如果您在blur()
事件中致电click
,则会导致change
事件触发(仅当广播框实际更改时)。
以下是我的表现:
// This is the hack for IE
if ($.browser.msie) {
$("#viewByOrg").click(function() {
this.blur();
this.focus();
});
}
$("#viewByOrg").change(function() {
// Do stuff here
});
现在您可以像平常一样使用更改事件。
编辑:添加了对focus()的调用以防止可访问性问题(请参阅下面的Bobby评论)。
答案 2 :(得分:33)
您是否尝试过IE的onpropertychange事件?我不知道它是否有所作为,但它可能值得一试。当通过JS代码更新值时,IE不会触发更改事件,但在这种情况下,onpropertychange可能会起作用。
$("#viewByOrg").bind($.browser.msie? 'propertychange': 'change', function(e) {
e.preventDefault(); // Your code here
});
答案 3 :(得分:14)
这也应该有效:
$(document).ready(function(){
$(".hiddenOnLoad").hide();
$("#viewByOrg, #viewByProduct").bind(($.browser.msie ? "click" : "change"), function () {
$(".visibleOnLoad").show();
$(".hiddenOnLoad").hide();
});
});
谢谢码头。这非常有帮助。
答案 4 :(得分:6)
在IE中,您必须在其他浏览器中使用click事件。 你的功能可能会变成
$(document).ready(function(){
$(".hiddenOnLoad").hide();
var evt = $.browser.msie ? "click" : "change";
$("#viewByOrg").bind(evt, function () {
$(".visibleOnLoad").show();
$(".hiddenOnLoad").hide();
});
$("#viewByProduct").bind(evt, function () {
$(".visibleOnLoad").hide();
$(".hiddenOnLoad").show();
});
});
答案 5 :(得分:6)
添加此插件
jQuery.fn.radioChange = function(newFn){
this.bind(jQuery.browser.msie? "click" : "change", newFn);
}
然后
$(function(){
$("radioBtnSelector").radioChange(function(){
//do stuff
});
});
答案 6 :(得分:4)
我对输入文字有同样的问题。
我改变了:
$("#myinput").change(function() { "alert('I changed')" });
到
$("#myinput").attr("onChange", "alert('I changed')");
一切都适合我!
答案 7 :(得分:2)
这是告诉IE在单击元素时触发change事件的简单方法:
if($.browser.msie) {
$("#viewByOrg").click(function() {
$(this).change();
});
}
您可以将其扩展为更通用的内容以使用更多表单元素:
if($.browser.msie) {
$("input, select").click(function() {
$(this).change();
});
$("input, textarea").keyup(function() {
$(this).change();
});
}
答案 8 :(得分:1)
我很确定这是IE的已知问题。为onclick
事件添加处理程序应解决问题:
$(document).ready(function(){
$(".hiddenOnLoad").hide();
$("#viewByOrg").change(function () {
$(".visibleOnLoad").show();
$(".hiddenOnLoad").hide();
});
$("#viewByOrg").click(function () {
$(".visibleOnLoad").show();
$(".hiddenOnLoad").hide();
});
$("#viewByProduct").change(function () {
$(".visibleOnLoad").hide();
$(".hiddenOnLoad").show();
});
$("#viewByProduct").click(function () {
$(".visibleOnLoad").hide();
$(".hiddenOnLoad").show();
});
});
答案 9 :(得分:1)
点击工作的诀窍......但是如果你想获得正确的无线电或复选框状态,你可以使用它:
(function($) {
$('input[type=checkbox], input[type=radio]').live('click', function() {
var $this = $(this);
setTimeout(function() {
$this.trigger('changeIE');
}, 10)
});
})(jQuery);
$(selector).bind($.browser.msie && $.browser.version <= 8 ? 'changeIE' : 'change', function() {
// do whatever you want
})
答案 10 :(得分:1)
如果将jQuery版本更改为1.5.1,则无需调整代码。然后IE9将倾听完美:
$(SELECTOR).change(function() {
// Shizzle
});
答案 11 :(得分:1)
从jquery 1.6开始这不再是一个问题..不确定它什么时候被修复了..虽然感谢上帝
答案 12 :(得分:1)
在IE中,强制收音机和复选框以触发“更改”事件:
if($.browser.msie && $.browser.version < 8)
$('input[type=radio],[type=checkbox]').live('click', function(){
$(this).trigger('change');
});
答案 13 :(得分:0)
这可能对某人有所帮助: 不是从表单的id开始,而是定位select id并在更改时提交表单,如下所示:
<form id='filterIt' action='' method='post'>
<select id='val' name='val'>
<option value='1'>One</option>
<option value='2'>Two</option>
<option value='6'>Six</option>
</select>
<input type="submit" value="go" />
</form>
和jQuery:
$('#val').change(function(){
$('#filterIt').submit();
});
(显然,提交按钮是可选的,以防javascript被禁用)
答案 14 :(得分:0)
//global
var prev_value = "";
$(document).ready(function () {
if (jQuery.browser.msie && $.browser.version < 8)
$('input:not(:submit):not(:button):not(:hidden), select, textarea').bind("focus", function () {
prev_value = $(this).val();
}).bind("blur", function () {
if($(this).val() != prev_value)
has_changes = true;
});
}
答案 15 :(得分:0)
试试这个,它对我有用
$("#viewByOrg")
.attr('onChange', $.browser.msie ? "$(this).data('onChange').apply(this)" : "")
.change( function(){if(!$.browser.msie)$(this).data('onChange').apply(this)} )
.data('onChange',function(){alert('put your codes here')});
答案 16 :(得分:0)
imo使用click而不是更改使ie行为不同。 我宁愿使用计时器(setTimout)模拟更改事件行为。
类似(警告 - 记事本代码):
if ($.browser.msie) {
var interval = 50;
var changeHack = 'change-hac';
var select = $("#viewByOrg");
select.data(changeHack) = select.val();
var checkVal=function() {
var oldVal = select.data(changeHack);
var newVal = select.val();
if (oldVal !== newVal) {
select.data(changeHack, newVal);
select.trigger('change')
}
setTimeout(changeHack, interval);
}
setTimeout(changeHack, interval);
}
$("#viewByOrg").change(function() {
// Do stuff here
});
答案 17 :(得分:0)
尝试以下方法:
.bind($.browser.msie ? 'click' : 'change', function(event) {
答案 18 :(得分:0)
在 jquery 的 .change <)功能之前,请避免使用 .focus()或 .select()对于IE,它工作正常,我在我的网站上使用它。
由于
答案 19 :(得分:0)
请尝试使用每个而不是更改 / 点击,这在IE和其他浏览器中首次正常工作< / p>
第一次不工作
$("#checkboxid").**change**(function () {
});
第一次工作正常
$("#checkboxid").**each**(function () {
});