我通过ID名称匹配ASP.Net生成的元素,但是我有一些元素可以呈现为文本框或标签,具体取决于页面上下文.我需要弄清楚匹配是否是文本框或标签,以便知道是通过val()还是通过html()获取内容.
$("[id$=" + endOfIdToMatch + "]").each(function () {
//determine whether $(this) is a textbox or label
//do stuff
});
Run Code Online (Sandbox Code Playgroud)
我找到了一个不起作用的解决方案,只返回"undefined":
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert($(this).tagName);
});
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
在我的ASP.Net应用程序,它是javascript和jQuery重,但也使用母版页和.Net Ajax片段,我一直在IE 6的状态栏(偶尔IE 7)看到消息"剩下2个项目"或"剩下15项",然后是"加载somegraphicsfile.png | gif".这条消息永远不会消失,可能会或可能不会阻止某些页面功能运行(它肯定似乎陷入困境,但我并不积极).
我可以通过刷新.aspx年龄使99%的时间发生这种情况,但项目数量,有时候,它提到的文件会有所不同.通常是2,3,12,13或15.
我用Google搜索了答案,并提出了一些建议或解释.他们中的一些人没有为我们工作,其他人对我们实施或尝试不切实际.
以下是一些想法/理论:
IE不是正确缓存图像,因此如果在页面上重复图像并且服务器假定它应该在本地缓存,则它会重复请求相同的图像,因为它已经在该页面上下文中提供了它.IE正确显示图像,但坐着等待从未到来的服务器响应.通常,页面上会重复它说它正在等待的文件.
该页面使用具有透明度的PNG图形.确实如此,但它们是jQuery-UI Themeroller生成的图形,根据jQuery-UI人员,IE是安全的.jQuery-UI组件是使用PNG的唯一内容.如果有帮助的话,我们所有的PNG引用都在CSS中.我已经将一些图形从PNG更改为GIF,但它可能会说它正在等待somegraphicsfile.png,就像somegraphicsfile.gif一样
图像在CSS和/或JavaScript中指定,但是在当前未显示的内容上(例如,显示:无项目).这可能是真的,但如果是,那么我认为预加载图像会起作用,但到目前为止,添加预加载器没有任何好处.
IIS的缓存策略使浏览器混乱.如果这是真的,那么只有Microsoft服务器SW出现微软浏览器的问题(这根本不会让我感到惊讶).不幸的是,我没有太多控制将托管应用程序的IIS配置.
有谁见过这个并找到了打击它的方法?特别是在使用jQuery和jQuery-UI的ASP.Net应用程序上?
UPDATE
另一个数据点:在至少一个页面上,只是注释掉jQuery-UI Datepicker组件设置会导致问题消失,但我不认为(或者至少我不确定)是否修复了所有问题的页面.如果它"修复"它们,我将不得不换掉插件,因为该功能需要存在.目前在IE6/7上似乎没有针对jQuery-UI的任何公开问题......
更新2
我检查了IIS设置,并且没有在我的任何文件夹上设置"启用内容过期" .取消选中该设置是解决此问题的常见建议.
我有另一个更简单的页面,我可以始终如一地创建错误.我正在使用jQuery-UI 1.6rc6文件(尽管我也尝试过jQuery-UI 1.7.1,结果相同).只有当我刷新包含jQuery-UI Datepicker的页面时才会出现此问题.如果我注释掉Datepicker设置,问题就会消失.我这样做时会注意到以下几点:
最终更新和答案
下面有很多好的答案和建议,但没有一个是我们的问题.最接近的一个(以及引导我解决方案的那个)是关于长期运行JavaScript的那个,所以我在那里授予赏金(我想我自己可以回答它,但我宁愿奖励导致解决方案的信息) .
这是我们的解决方案:我们有多个jQueryUI日期选择器,它们是在ASP.Net母版页中包含的脚本中的$(document).ready事件中创建的.在此客户端页面上,本地脚本的$(document).ready事件具有在特定条件下销毁日期选择器的脚本.我们不得不使用"destroy",因为以前版本的datepicker遇到了"禁用"问题.当我们升级到最新版本的jQuery UI(1.7.1)并用"禁用"替换了"destroy"s为datepickers时,问题就消失了(或者大部分都消失了 - 如果你在页面上做得太快的话正在加载,仍然可以获得"n项剩余"状态).
我关于发生的事情的理论是这样的:
我正在开发一个ASP.Net Web应用程序,它必须在标准的Avery样式标签纸上打印动态创建的标签(一个特定的大小,所以只有一个整体布局).标签具有可变数量的线(3-6),并且可以包含文本行或图形条形码图像.
我继承的第一个剪辑,使用等宽字体来减少格式问题,但是这不允许在标签上放置足够的文本并且客户不满意.基本上它是格式化的文本.
我的下一个版本使用TABLE,DIV,CSS和一些JavaScript计算来使用比例字体格式化标签.它仍然需要一些调整(用户必须正确设置他们的打印边距并关闭打印页眉和页脚),但它似乎工作.
但是,似乎不同的打印机如何渲染文本(WYS不是WYG)有一些变化,所以即使我们使用至少两种不同的打印机(喷墨打印机和激光打印机)在不同的浏览器上进行测试,一些用户的标签不排队.通过调整页面设置对话框中的边距可以调整轻微的边距变化,但更难的问题是标签间距可能会偏离一小部分英寸,因此如果第一个标签很好地居中,那么页面末尾标签文本和图像已从标签的顶部或底部爬出.
我们即将转向生成Word,Excel或PDF输出,这将花费相当多的开发时间并可能在打印过程中添加额外的步骤.
那么,有没有人对如何在不同类型的打印机上精确渲染的HTML/CSS布局有任何建议?我不太关心线/字断点是否有点不同,但我需要能够预测位置每个标签区域的左上角.
现在,标签在表格中向下流动,我们一直在调整单元格和内部DIV的盒子模型,使它们达到统一的高度.我怀疑使用每个元素的绝对定位可能是最好的答案,但由于ASP.Net生成标签元素,这也很棘手.如果我肯定知道它会起作用,我宁愿尝试它而不是扔掉我们必须去的另一代方法.
轻微更新:现在我正在进行一些绝对定位测试 - 仅设置包含块元素的顶部和左侧坐标.到目前为止,页面上的偏移量(页边距,纸张对齐等)都有微小的变化,但所有测试的浏览器和打印机都准确地将元素放入彼此相对正确的位置上.我很欣赏PDF提示,但是有没有人知道使用绝对定位的其他"陷阱"?
更新: 为了记录,我使用iTextSharp重写了标签打印部分并且它完美地工作 - 绝对是将来这样做的方式...
如何从Web应用程序生成纸质打印?
具体来说,我正在考虑更复杂的纸质文件,如文凭,发票和合同.包含框架,表格,徽标和页眉/页脚的可变页数.
今天我使用自定义表单和CSS用于某些事情,iTextSharp用于其他人(我使用asp.net和MS-SQL),但我认为这两种方法都非常耗时且很难在不同文档中保持一致.
还有更好的方法吗?
我有一个包含许多文本字段的PDF表单.在这些字段中输入的值用于计算其他字段中的值(计算字段是只读的).
当我在Adobe Reader中打开表单并填写字段时,计算字段会自动重新计算.
但是,我使用iTextSharp填充字段,展平生成的表单,然后通过Web将展平的表单流回用户.
该部分工作正常,但计算字段永远不会计算.我假设因为没有用户触发事件(如keydowns或焦点或模糊)正在触发,所以不会发生计算.
显然,我可以从可填写的表单中删除计算,并在填充字段时在服务器上完成所有计算,但我希望可填写的表单可供人类和服务器使用.
有谁知道如何强制计算?
编辑:我感觉不是太多iText/iTextSharp在这里爱...
这里有一些细节.将stamper.AcroFields.GenerateAppearances设置为true无济于事.
我认为答案在于页面操作中的某个地方,但我不知道如何触发它...
希望一张图片值得千行代码,因为我不想删除所有的ASP.Net代码,HTML,JavaScript和CSS来提供一个例子(但我会根据要求提供我可以提供的代码)如果有人不说"哦,我以前见过这个!试试这个...")[实际上,我确实发布了一些代码和CSS - 见问题的底部].
以下是Firefox中显示的表单页面的一部分:

蓝色框是<label>标签的临时样式,橙色线是标签的临时边框样式<div>(因此我可以看到它们延伸和断开的位置).该<label>'s的风格来float: left为是<div的右侧.此外,它的后代控件<div>也float:left纯粹是因此它们将排列在顶部<div>(因为有一些较高的控件,如下面的多行文本框).
单选按钮是由ASP控件生成的,所以它们被包裹在<span>- 也是浮动的左边,因为它是一个后代<div>.
这是IE7中呈现的屏幕的相同部分:

有一些小的渲染差异,但是让我疯狂的一个重要因素是<input>控件旁边的额外空白区域!请注意,<span>单选按钮和复选框周围的正确排列.
虽然它们没有显示,但下拉列表和列表框也会出现同样的情况.我没有尝试将输入控件包装在a中<span>,但这可能有效.不过,这是一个丑陋的黑客行为.
我已经尝试了几个IE7解决方案的问题,我已经编辑了CSS,直到我处于纯巫毒模式(即随机变化,希望有些东西有效).就像我说的那样,我希望有人会看到这个并说:"我以前见过这个!试试这个..."
任何人?
后续1:
我正在使用XHTML 1.0 Transitional <DOCTYPE>,所以我应该处于标准模式.
后续2:
以下是上面生成的代码的小片段(第一个控件和最后一个控件).请注意,此代码由ASP.Net生成,然后由JavaScript/jQuery动态编辑.
<fieldset id="RequestInformation">
<legend>Request Information</legend>
<ol>
<li>
<label id="ctl00_ContentPlaceHolder1_txtRequestDate_L" class="stdLabel"
for="ctl00_ContentPlaceHolder1_txtRequestDate">Request Date:</label>
<div class="FormGroup">
<input id="ctl00_ContentPlaceHolder1_txtRequestDate" class="RSV DateTextBox hasDatepicker"
type="text" value="10/05/2004" name="ctl00$ContentPlaceHolder1$txtRequestDate"/>
<img class="ui-datepicker-trigger" src="/PROJECT/images/Calendar_scheduleHS.png" alt="..." title="..."/>
<span id="txtRequestDate_error"/>
</div>
</li>
--STUFF DELETED HERE-- …Run Code Online (Sandbox Code Playgroud) 考虑以下示例代码:
<div class="containter" id="ControlGroupDiv">
<input onbeforeupdate="alert('bingo 0'); return false;" onclick="alert('click 0');return false;" id="Radio1" type="radio" value="0" name="test" checked="checked" />
<input onbeforeupdate="alert('bingo 1'); return false;" onclick="alert('click 1');return false;" id="Radio2" type="radio" value="1" name="test" />
<input onbeforeupdate="alert('bingo 2'); return false;" onclick="alert('click 2');return false;" id="Radio3" type="radio" value="2" name="test" />
<input onbeforeupdate="alert('bingo 3'); return false;" onclick="alert('click 3');return false;" id="Radio4" type="radio" value="3" name="test" />
<input onbeforeupdate="alert('bingo 4'); return false;" onclick="alert('click 4');return false;" id="Radio5" type="radio" value="4" name="test" />
<input onbeforeupdate="alert('bingo 5'); return false;" onclick="alert('click 5');return false;" id="Radio6" type="radio" …Run Code Online (Sandbox Code Playgroud) 这应该很容易(至少没有其他人似乎有类似的问题),但我无法看到它在哪里打破.
我将Markdown'ed文本存储在我的应用程序页面上输入的数据库中.使用WMD输入文本,实时预览看起来正确.
在另一页上,我正在检索降价文本并使用Showdown.js将其转换回HTML客户端进行显示.
假设我有这样的文字:
The quick **brown** fox jumped over the *lazy* dogs.
1. one
1. two
4. three
17. four
Run Code Online (Sandbox Code Playgroud)
我在我的jQuery文档就绪事件中使用这段Javascript来转换它:
var sd = new Attacklab.showdown.converter();
$(".ClassOfThingsIWantConverted").each(function() {
this.innerHTML = sd.makeHtml($(this).html());
}
Run Code Online (Sandbox Code Playgroud)
我怀疑这是我的问题所在,但它几乎可以工作.
在FireFox中,我得到了我的预期:
快速的棕色狐狸跳过懒狗.
但在IE(7和6)中,我得到了这个:
快速的棕色狐狸跳过懒狗.1.一个1.两个4.三个17.四个
显然,IE正在剥离我的降价代码中断并将它们转换为空格.当我查看原始代码的视图源(在脚本运行之前)时,容器DIV中有中断.
我究竟做错了什么?
UPDATE
它是由IE innerHTML/innerText"quirk"引起的,我之前应该在ASP.Net页面上使用数据绑定控件提到这一点 - 否则显然有很多不同的解决方法.
我有类似于以下的ASP.Net代码(这是在FIELDSET内):
<ol>
<li>
<label>Some label</label>
<one or more form controls, ASP.Net controls, labels, etc.>
</li>
<li>
<label>Another label</label>
<... more of the same...>
</li>
...
</ol>
Run Code Online (Sandbox Code Playgroud)
我试图保持我的标记尽可能干净,但我已经决定,出于各种原因,我需要在第一个标签之后将DIV包装在列表项中的所有内容中,如下所示:
<ol>
<li>
<label>Some label</label>
<div class="GroupThese">
<one or more form controls, ASP.Net controls, labels, etc.>
</div>
</li>
<li>
<label>Another label</label>
<div class="GroupThese">
<... more of the same...>
</div>
</li>
...
</ol>
Run Code Online (Sandbox Code Playgroud)
我宁愿通过jQuery使用"不显眼的Javascript"来做这个,而不是用额外的标记乱丢我的页面,所以我可以保持表单在语义上"干净".
我知道如何编写一个jQuery选择器来获取每个列表项$("li + label")中的第一个标签或使用:first-child.我也知道如何在选择后插入东西.
我无法弄清楚(至少在深夜)是如何在列表项中的第一个标签之后找到所有内容(或者基本上列表项中的所有内容除了第一个标签之外都是另一种方式)在文档就绪函数中围绕它包装DIV.
更新:
一旦我删除了周围的单引号,Owen的代码就可以工作了:
$('this') 并设置适当的decendent选择器: $("li label:first-child") 只能选择列表项后出现的第一个标签.
这是我做的:
$(document).ready(function() {
$('li label:first-child').each(function() {
$(this).siblings().wrapAll('<div class="GroupThese"></div>');
});
});
Run Code Online (Sandbox Code Playgroud)