我有一个按钮,当它被点击时会运行一个长时间运行的功能.现在,当函数运行时,我想更改按钮文本,但我在Firefox,IE等浏览器中遇到问题.
HTML:
<button id="mybutt" class="buttonEnabled" onclick="longrunningfunction();"><span id="myspan">do some work</span></button>
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
document.getElementById("mybutt").disabled = true;
document.getElementById("mybutt").className = "buttonDisabled";
//long running task here
document.getElementById("myspan").innerHTML = "done";
}
Run Code Online (Sandbox Code Playgroud)
现在这在firefox和IE中都有问题,(在chrome中它可以正常工作)
所以我想把它放到一个settimeout:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
document.getElementById("mybutt").disabled = true;
document.getElementById("mybutt").className = "buttonDisabled";
setTimeout(function() {
//long running task here
document.getElementById("myspan").innerHTML = "done";
}, 0);
}
Run Code Online (Sandbox Code Playgroud)
但这对firefox也不起作用!按钮被禁用,更改颜色(由于新css的应用)但文本不会更改.
我必须将时间设置为50毫秒而不是仅仅0毫秒,以使其工作(更改按钮文本).现在我至少发现这个愚蠢.我可以理解它是否只能在0ms的延迟下工作,但在较慢的计算机中会发生什么?也许firefox在settimeout需要100ms?听起来很愚蠢.我尝试了很多次,1毫秒,10毫秒,20毫秒......不,它不会刷新它.只有50ms.
所以我遵循了这个主题的建议:
在javascript dom操作之后强制在Internet Explorer中进行DOM刷新
所以我试过了:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
var a = document.getElementById("mybutt").offsetTop; //force …Run Code Online (Sandbox Code Playgroud) 所以我在客户端(输入后)删除控制字符(tab,cr,lf,\ v和所有其他隐形字符),但由于客户端不可信,我必须在服务器中删除它们.
所以根据这个链接http://www.utf8-chartable.de/
控制字符从x00到1F,从7F到9F.因此我的客户端(javascript)控件删除功能是:
return s.replace(/[\x00-\x1F\x7F-\x9F]/g, "");
Run Code Online (Sandbox Code Playgroud)
和我的php(服务器)控件删除功能是:
$s = preg_replace('/[\x00-\x1F\x7F-\x9F]/', '', $s);
Run Code Online (Sandbox Code Playgroud)
现在,这似乎会产生国际utf8字符的问题,例如PHP中的ς(xCF x82)(因为x82在第二个序列组中),javascript等效不会产生任何问题.
现在我的问题是,我应该将控制字符从7F删除到9F吗?据我所知,从127到159(7F到9F)的序列显然可以是有效的UTF-8字符串的一部分?
另外,也许我甚至不应该过滤00到31个控制字符,因为这些字符中的一些可能会出现在一些奇怪的(日语?中文?)但是有效的utf-8字符?
用户点击表格的一行,我想(在Javascript中)得到该行的第3列的内部HTML.
就像是 :
document.getElementById("tblBlah").rows[i].columns[j].innerHTML
Run Code Online (Sandbox Code Playgroud)
似乎无法实现,我在这里或网上找不到任何东西.
任何解决方案将非常感谢(没有jQuery)
我有这堂课:
function ctest() {
this.var1 = "haha";
this.func1 = function() {
alert(this.var1);
func2();
alert(this.var1);
}
var func2 = function() {
this.var1 = "huhu";
}
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
var myobj = new ctest();
myobj.func1();
Run Code Online (Sandbox Code Playgroud)
是不是第二个警报会弹出"huhu"?func2是私有的,是否可以访问var1公共变量?
如果私有函数无法访问公共变量,我该怎么办?
提前致谢!
讨厌为前一个扩展打开一个新问题:
function ctest() {
this.iteration = 0;
this.func1 = function() {
var result = func2.call(this, "haha");
alert(this.iteration + ":" + result);
}
var func2 = function(sWord) {
this.iteration++;
sWord = sWord + "lol";
if ( this.iteration < 5 ) {
func2.call(this, sWord);
} else {
return sWord;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会返回iteration = 5,但结果是UNDEFINED?怎么可能?我明确地返回了sWord.它应该返回"hahalollollollollol"并且仅用于双重检查,如果我在返回sWord之前警告(sWord)它正确地显示它.
所以我在容器div中有大量的div(4000-5000)[每个包含跨度,锚点,图像等],基本上我将它们的显示设置为none或基于条件阻止.这确实需要一些时间.
在我搜索更快的内容时,我遇到了这个页面https://developers.google.com/speed/articles/javascript-dom,解决方法是从DOM中删除容器div并通过getElementsByTagName迭代包含的元素.
/**
* Remove an element and provide a function that inserts it into its original position
* @param element {Element} The element to be temporarily removed
* @return {Function} A function that inserts the element into its original position
**/
function removeToInsertLater(element) {
var parentNode = element.parentNode;
var nextSibling = element.nextSibling;
parentNode.removeChild(element);
return function() {
if (nextSibling) {
parentNode.insertBefore(element, nextSibling);
} else {
parentNode.appendChild(element);
}
};
}
function updateAllAnchors(element, anchorClass) {
var insertFunction = removeToInsertLater(element);
var …Run Code Online (Sandbox Code Playgroud) 几天前,我实现了一个自动填充建议系统,该系统根据语言使用字典.以下是它的工作原理:JQuery UI自动完成 - >调用.php文件 - >调用VB6 COM dll函数 - >调用.sqlite文件并根据键入的字母查找结果 - >将结果返回给php - >将结果返回给JS .
它的工作速度相当快,因为它完成每个操作平均需要约7(毫秒).在高峰时段,谷歌分析显示约1200名在线用户,通常我们每天都会half a million调用〜这个特定的功能.
从这个自动完成建议系统上线的那天起,我开始注意到数百个非常具体的错误消息:
Not enough storage is available to complete this operation.
CoInitialize has not been called.
Run Code Online (Sandbox Code Playgroud)
一些可能有用的信息:
a)这些消息主要出现在峰值游客horus期间
b)它们并不总是只出现在特定的功能上,而是出现在其他功能上(但在我们实现上述系统之前从未这样做过)
c)之前我使用过sqlite数据库来获取其他东西(不像实时那么多,就像在用户输入时返回结果一样)但是从来没有出现这样的问题
d)sqlite文件的大小约为350MB,有3个表,其中一个有~220万个条目,另一个有1,600万个,另外有~16,000个条目和所有必要的列被索引.
e)显然,该数据库用于只读操作
f)系统禁用后,所有消息都会停止.
g)我每天都会收到大约一千条这样的错误消息(每天有大约500.000次调用函数)
服务器系统是两个(x2)盒子:核心I7 4770在3,8GHZ,32GB RAM,Windows服务器2012和IIS.
消息随机出现,仅在高峰时段出现.我无法在开发机器上复制问题.到目前为止,搜索互联网一直没有结果.关于导致它的原因以及如何解决的任何想法都将受到欢迎.
谢谢.
我想要实现的是保留textarea中的序列空格,并且在行的末尾不要破坏单词.
所以根据这个:http: //www.w3schools.com/cssref/pr_text_white-space.asp
当我们设定
white-space: pre-wrap;
Run Code Online (Sandbox Code Playgroud)
WHITESPACES应该保留下来,并且最后不要分开.
然而,正如这个jsfiddle演示的那样,google chrome不会保留空白序列(textarea中有很多空格但是chrome显示的更少.请注意每个其他浏览器如何显示它们,但chrome no).
有没有解决这个问题的方法?
我可以使用以下方法保留空格:
white-space: pre;
Run Code Online (Sandbox Code Playgroud)
但是然后所有长的单词在行的末尾分开(虽然仅用于chrome ...)
有什么解决方案吗?
提前致谢!
编辑:尝试在该jsfiddle的一行连续输入空格.一旦光标到达最右端,光标就会卡住,并且不会在下一行(chrome)下面
我正在尝试拥有一个可拖动的div,它也可以从其中的textarea中拖出来.
HTML:
<div id="divContainer">
<textarea id="text"></textarea>
</div>
Run Code Online (Sandbox Code Playgroud)
CSS:
#divContainer {
position: absolute;
left: 10px;
top: 10px;
width: 100px;
height: 100px;
background-color: blue;
}
#text {
position: absolute;
left: 5px;
top: 5px;
width: 50px;
height: 50px;
background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
jQuery的:
$("#divContainer").draggable();
Run Code Online (Sandbox Code Playgroud)
div如果我通过单击该div区域拖动,我可以拖动,但如果我单击该textarea区域则不能拖动.
有办法解决这个问题吗?
这是jsFiddle
我的应用程序广泛使用mb_字符串函数,并切换到PHP 7导致整体较慢的应用程序.我将问题跟踪到mb_字符串函数.以下是基准代码和结果:
$time = microtime();
$time = explode(' ', $time);
$start = $time[1] + $time[0];
$startms = $time[0];
for ($i=0; $i<100000; $i++) {
$a = mb_strlen("fdsfdssdfoifjosdifjosdifjosdij:?", "UTF-8");
}
$time = microtime();
$time = explode(' ', $time);
$finish = $time[1] + $time[0];
$finishms = $time[0];
$total_time = round(($finish - $start), 4);
echo "mb_strlen: " . $total_time*1000 ." milliseconds<br/>";
$time = microtime();
$time = explode(' ', $time);
$start = $time[1] + $time[0];
$startms = $time[0];
for ($i=0; $i<100000; $i++) {
$a = …Run Code Online (Sandbox Code Playgroud)