$('#textboxId')。val()返回旧值(浏览器缓存问题)

时间:2012-05-29 18:57:25

标签: javascript ajax

尽管花了好几个小时,但我无法弄清楚这一点。我有一个简单的动态创建页面(使用控制器加载的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都不同。

5 个答案:

答案 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")来解决它。

相关问题