2011-10-27 27 views
0

我在其中一组文本框是基于被运项目的数量创造了一个页面:如何重新调整光标到无效的输入元素

<c:forEach var="num" begin="1" end="${qtyToShip}" step="1" varStatus ="status"> 
    <tr> 
    <td> 
     <input class="form-med" type="text" name="shipItems[${num - 1 }].barCode" id="shipItems[${num - 1 }].barCode" onchange="if(!G2Step2Validate(this,'${shippingCommand.boxType}')){$(this).focus();}" /> 
    </td> 
    <td> 
     <input class="form-med" type="text" name="shipItems[${num - 1 }].shipCompanyBarCode" onkeyup="if (!(event.keyCode==16 || (event.keyCode==9 && event.shiftKey))) {UPSStep2Validate(this);}"/> 
    </td> 
    </tr> 
</c:forEach> 

这里是我想发生什么。当用户输入条形码时,我需要进行AJAX调用以验证条形码是否有效(可用于,正在发送的内容以及尚未在此订单上使用的内容 - 防止重复扫描)。

使用DWR的AJAX和该服务都工作正常。

问题是,如果验证失败,我希望焦点返回到有问题的字段。这没有发生。重点总是转到下一个输入框。我试图与不同的事件:改变,模糊,关键等我已经尝试将焦点内联,在JavaScript中,尝试过与jQuery,JavaScript等,但没有运气。

寻找关于如何将焦点放回导致问题的输入框的建议/解决方案。

+0

您是否尝试过调用您想获得焦点的DOM元素的“.focus()”方法?这就是你必须要做的。 – Pointy

回答

0

由于AJAX的性质,原来的做法是无效的。那就是

<input class="form-med" type="text" name="shipItems[${num - 1 }].barCode" id="shipItems[${num - 1 }].barCode" onchange="if(!G2Step2Validate(this,'${shippingCommand.boxType}')){$(this).focus();}" /> 

不能完成。我想出了解决的办法是这个

<input class="form-med" type="text" name="shipItems[${num - 1 }].barCode" id="shipItems[${num - 1 }].barCode" onchange="G2Step2Validate(this,'${shippingCommand.boxType}');" /> 

然后在正在Ajax调用,如果错误发生有那么具有焦点设置的控制JavaScript函数。

0

如果您使用onblur,即使您可以设置焦点。问题在于时间和onchange事件被触发。

<input class="form-med" type="text" name="shipItems[0].barCode" id="shipItems[0].barCode" onblur="if(true){this.focus();}" /> 

为了确保光标在IE结束时,您可以添加一个onfocus事件:

<input class="form-med" type="text" name="shipItems[0].barCode" id="shipItems[0].barCode" onblur="if(true){this.focus();}" onfocus="this.value = this.value;" /> 
+0

问题在于我正在进行ajax调用。所以看起来焦点在ajax调用完成时已经改变了。所以,调用this.focus()将不会执行这个技巧,因为'this'已经被移动到下一个dom对象。 – boyd4715

+0

@ boyd4715抱歉,如果G2Step2Validate包含异步Ajax调用,则必须在该Ajax调用的回调中设置焦点。由于G2Step2Validate的第一个参数是this,因此将其分配给一个变量并从Ajax回调中调用yourVariable.focus()。如果你提供了G2Step2Validate方法体,如果需要的话,我可以帮你进一步。 – Craig