尽管花了好几个小时,但我无法弄清楚这一点。我有一个简单的动态创建页面(使用控制器加载的vbhtml),带有两个文本框。
页面上有一个保存按钮。此按钮调用页内Javascript函数。在函数中我有这些行:
function saveData()
{
var lDescr = $('#FundNote').val(); // FundNote is the id of a textbox
var DocUrl = $('#DocUrl').val(); // DocUrl is the id of another textbox
alert(lDescr);
alert(DocUrl);
//ajax call to a controller
}
问题在于,每次显示此页面时,这些变量都会继续返回与第一次输入的值相同的值。如果我清理浏览器缓存,则返回新输入的值,但随后它会继续返回相同的值,直到再次清理浏览器缓存。每次显示此页面时,文本框都为空,用户输入值,因此页面本身不会保留值。
任何指针?
花了好几天后,我就这样做了(暂时)。
看来即使控制器正在发送更新的html并在浏览器上显示正常(html包含一个下拉框,动态填充不同的值。每次值不同但在javascript中,旧值是被返回(例如,选择选项的旧值,该值甚至不包括在html的当前呈现中。)仍然不知道为什么会发生这种情况。解决方案中还有其他类似的页面,它们工作正常。)
无论如何,我做了什么(现在让它工作),我在类中添加了一个RandonNo()属性,动态创建这个html(通过控制器和vbhtml文件)。然后在vbhtml中,我将这个randon数附加到所有html组件ID。我也将相同的号码传递给javascript“Save()
”函数,例如OnClick="Save('@Model.RandonNo')
。在Save方法中,我更改了$('#idOption') to $('#idOption-'+ randomno)
。它似乎有效,因为每次ID都不同。
答案 0 :(得分:1)
有时浏览器会缓存表单输入值,因此如果您返回页面,则无需重新输入内容。要禁用它,请设置<form ... autocomplete="off">
。这将阻止表单重新加载用户上次在页面加载时键入的内容。
听起来这不是你关心的问题,而是你关注的是输入中的文字不是.val()
的回报。如果是这种情况,请展示一些代码,让我们深入研究。
答案 1 :(得分:1)
我知道这是一个老问题,但我觉得它需要一个解决方案,因为jQuery仍在这样做。我一直有一个非常类似的问题,但最终找到了解决方法。问题似乎是在.val()中。出于某种原因,jQuery在用于获取/设置输入时希望自动填充缓存中的输入。在我的情况下,我做了这样的事情:
HTML文件:
<form ...>
<input type="hidden" name="my_value" value="X" />
</form>
JS文件:
$( document ).ajaxSuccess( function ( event, jqxhr, settings, data ) {
if ( settings.dataType == 'json' && data && data.my_value ) {
$( 'input[name="my_value"]' ).val( data.my_value );
}
} );
如果我在不清除缓存的情况下刷新页面,则输入将在初始页面请求中使用来自AJAX请求的缓存值自动覆盖,即使它们已经填充了服务器响应中的值。为了解决这个问题,我将.val(...)更改为.attr(&#39; value&#39;,...),所以行:
$( 'input[name="my_value"]' ).val( data.my_value );
成了
$( 'input[name="my_value"]' ).attr( 'value', data.my_value );
所以我认为你需要做的就是解决你的问题就是改变:
var lDescr = $('#FundNote').val(); // FundNote is the id of a textbox
var DocUrl = $('#DocUrl').val(); // DocUrl is the id of another textbox
到
var lDescr = $('#FundNote').attr( 'value' ); // FundNote is the id of a textbox
var DocUrl = $('#DocUrl').attr( 'value' ); // DocUrl is the id of another textbox
我不确定这是jQuery本身还是导致它的插件,但它真的很奇怪。看起来如果你在任何时候使用.val()从/向输入获取/设置一个值,你就会导致你的输入&#39;如果您稍后刷新或再次访问该页面,则会使用缓存值损坏这些值。当调用.val()时,这种损坏似乎不会发生,而是在文档加载时发生。
总而言之,对输入的get / set调用.val()会导致在初始页面请求期间缓存返回/设置的值。未来的请求将有输入&#39;使用在初始请求期间返回/设置的值加载文档后,值被破坏,直到您清除浏览器缓存。
答案 2 :(得分:0)
不要缓存值(.val()),缓存jQuery对象:
function saveData() {
var lDescr = $('#FundNote'); // FundNote is the id of a textbox
var DocUrl = $('#DocUrl'); // DocUrl is the id of another textbox
alert( lDescr.val() );
alert( DocUrl.val() );
//ajax call to a controller
}
答案 3 :(得分:0)
我有同样的问题,经过一些尝试,我发现了一个适合我的替代方案......
bool
可能看起来有点“奇怪”的解决方案,但它确实有效!
答案 4 :(得分:0)
我遇到了相同的问题,我用val()
切换了attr("value")
来解决它。