1

尽管花费了数小时,但我无法弄清楚这一点。我有一个带有两个文本框的简单动态创建页面(使用控制器加载的 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 中,我将这个随机数附加到所有 html 组件 ID。我也像这样将相同的数字传递给 javascript" Save()" 函数OnClick="Save('@Model.RandonNo')。在 Save 方法中,然后我更改了$('#idOption') to $('#idOption-'+ randomno). 它似乎正在工作,因为 ID 每次都不同。

4

5 回答 5

2

我知道这是一个老问题,但我觉得它需要一个解决方案,因为 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( 'value', ... ),所以行:

$( '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( ) 从输入/向输入获取/设置值,如果您稍后再次刷新或访问该页面,您将导致输入的值被缓存值损坏. 调用 .val( ) 时似乎不会发生这种损坏,而是在加载文档时发生。

总而言之,调用 .val() 以获取/设置输入会导致在初始页面请求期间缓存返回/设置的值。未来的请求将在文档加载后使用初始请求期间返回/设置的值损坏输入值,直到您清除浏览器缓存。

于 2014-08-10T05:03:54.677 回答
1

有时浏览器会缓存表单输入值,因此如果您返回页面,则无需重新输入内容。要禁用它,请设置<form ... autocomplete="off">. 这将阻止表单重新加载用户上次在页面加载时键入的内容。

听起来这不是您关心的问题,而是您关心的是输入中的文本不是从.val(). 如果是这种情况,请显示一些代码,然后让我们深入研究。

于 2012-05-29T19:34:18.940 回答
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
}

于 2012-05-30T22:33:23.097 回答
0

我有同样的问题,经过一些尝试,我发现了一个适合我的替代方案......

$("#id").valueOf().valueOf().valueOf().val();

可能看起来一些“奇怪”的解决方案,但它有效!

于 2015-12-30T19:34:59.970 回答
0

我遇到了同样的问题,我切换val()attr("value")修复它。

于 2020-07-10T09:43:05.927 回答