任何人都想要了解为什么这个书签在IE8中失败?它在Friefox和Safari中将所有文本都变为大写。但是在IE8中,它只是“加载...”而停止运行我已经启用了运行scriplets并降低了IE8中的javascript安全设置。
更新3/19/10:此书签现在可以在IE浏览器中运行,感谢sergey。
javascript:
(function(){
var i,t,D=document,h,f,g=D.getElementsByTagName,ce=D.createElement,c=D.createStyleSheet,ac='appendChild',cn='childNodes',l,s='*{text-transform:uppercase}input,textarea{text-transform:none}';
for(i=0;t=document.getElementsByTagName('textarea')[i];i++)
t.value=t.value.toUpperCase();
if(D.namespaces){
h=g('head')[0];
f=h[ac](ce('div'));
f.innerHTML='b<style type=\'text/css\'>'+s+'</style>';
h[ac](f[cn][1]);
f.parentNode.removeChild(f);
}
else
if(c){
c('javascript:\''+s+'\'')
}
else{
l=document.createElement('link');
l.rel='stylesheet';
l.href='data:text/css,'+escape(s);
D.documentElement[cn][0][ac](l)
}
}
)()
答案 0 :(得分:3)
对代码的少量添加将起到作用:
javascript:(function(){
var i,t,D=document;
for(i=0;t=D.getElementsByTagName('textarea')[i];++i)
t.value=t.value.toUpperCase();
var newSS,styles='*{text-transform:uppercase}input,textarea{text-transform:none}';
if (document.namespaces) {
var head = document.getElementsByTagName("head")[0];
var factory = head.appendChild(document.createElement("div"));
factory.innerHTML = ' <style type=\'text/css\'>' + styles + '</style>';
head.appendChild(factory.childNodes[1]);
factory.parentNode.removeChild(factory);
}
else
if(D.createStyleSheet){
D.createStyleSheet("javascript:'"+styles+"'");
}
else{
newSS=D.createElement('link');
newSS.rel='stylesheet';
newSS.href='data:text/css,'+escape(styles);
D.documentElement.childNodes[0].appendChild(newSS);
}
}
)()
更新17/03/10:我缩小了代码,创建了一个书签,并在IE中成功使用它。
更新18/03/10:我注意到缩小的代码没有在IE浏览器以外的地方运行,这里是经过测试的版本:
javascript:(function(){var i,t,D=document,h,f,g=D.getElementsByTagName,ce=D.createElement,c=D.createStyleSheet,ac='appendChild',cn='childNodes',l,s='*{text-transform:uppercase}input,textarea{text-transform:none}';for(i=0;t=document.getElementsByTagName('textarea')[i];i++)t.value=t.value.toUpperCase();if(D.namespaces){h=g('head')[0];f=h[ac](ce('div'));f.innerHTML='b<style type=\'text/css\'>'+s+'</style>';h[ac](f[cn][1]);f.parentNode.removeChild(f);}else if(c){c('javascript:\''+s+'\'')}else{l=document.createElement('link');l.rel='stylesheet';l.href='data:text/css,'+escape(s);D.documentElement[cn][0][ac](l)}})()
答案 1 :(得分:2)
作为参考,这是“未经授权”的代码:
javascript:(function () {
var i, t, D = document;
for (i = 0; t = D.getElementsByTagName('textarea')[i]; ++i) {
t.value = t.value.toUpperCase();
var newSS, styles = '* { text-transform: uppercase; } input, textarea { text-transform: none}';
if (D.createStyleSheet) {
D.createStyleSheet("javascript:'" + styles + "'");
} else {
newSS = D.createElement('link');
newSS.rel = 'stylesheet';
newSS.href = 'data:text/css,' + escape(styles);
D.documentElement.childNodes[0].appendChild(newSS);
}
}
})()
我的Mac上没有IE 8,但尝试在alert('here at line XXX');
中为穷人调试。
也许IE 8不喜欢样式表的javascript:
来源?
此外,循环添加的样式表与textareas一样多。那太傻了。将其移出循环,如下所示:
javascript:(function () {
var i, t, D = document;
for (i = 0; t = D.getElementsByTagName('textarea')[i]; ++i) {
t.value = t.value.toUpperCase();
}
var styles = '* { text-transform: uppercase; } input, textarea { text-transform: none}';
if (D.createStyleSheet) {
D.createStyleSheet("javascript:'" + styles + "'");
} else {
var newSS = D.createElement('link');
newSS.rel = 'stylesheet';
newSS.href = 'data:text/css,' + escape(styles);
D.documentElement.childNodes[0].appendChild(newSS);
}
})()
请注意,该代码中仍有一些值得怀疑的事情。我不太确定那个循环的条件。我会做的是将它从循环中解脱出来,就像这样:
javascript:(function () {
var D = document;
var i, t = D.getElementsByTagName('textarea');
for (i = 0; i < t.length; i++) {
t[i].value = t[i].value.toUpperCase();
}
/* Rest of the code here. */
})()
作为对读者/提问者的练习:这只是大写文本,而不是文本输入。
修改强>: 将其缩小至最大长度以下:
javascript:(function () {
var D = document;
var i, t = D.getElementsByTagName('textarea');
for (i = 0; i < t.length; i++) {
t[i].value = t[i].value.toUpperCase();
}
D.createStyleSheet('javascript:"* { text-transform: uppercase; } input, textarea { text-transform: none}"');
})()
结果:
javascript:(function(){var D = document;var i,t=D.getElementsByTagName('textarea');for(i=0;i<t.length;i++)t[i].value=t[i].value.toUpperCase();D.createStyleSheet('javascript:"*{text-transform:uppercase;}input,textarea{text-transform:none}"');})()
这只有特定于IE的代码。