Javascript 如何替换css(';背景图像';)
我想替换css(“背景图像”)路径 问题是: 对于同一变量Javascript 如何替换css(';背景图像';),javascript,css,background-image,Javascript,Css,Background Image,我想替换css(“背景图像”)路径 问题是: 对于同一变量oldBgImg=this.element.css('background-image') 火狐回归- "url("http://mySite/images/file1.png")" 但是Chrome返回的没有引号: "url(http://mySite/images/file1.png)" 这是我使用的解决方案。你能帮我简化一下吗 var oldBgImg = this.element.css('background-image')
oldBgImg=this.element.css('background-image')
火狐回归-
"url("http://mySite/images/file1.png")"
但是Chrome返回的没有引号:
"url(http://mySite/images/file1.png)"
这是我使用的解决方案。你能帮我简化一下吗
var oldBgImg = this.element.css('background-image');
// => FF: "url("http://mySite/images/file1.png")"
// Chrome: "url(http://mySite/images/file1.png)"
// According to http://www.w3.org/TR/CSS2/syndata.html#value-def-uri :
// quotes are optional, so Chrome does not use them, but FF does . . .
var n1 = oldBgImg.lastIndexOf("("); n1 += 1; // now points to the char after the "("
var n2 = oldBgImg.lastIndexOf(")"); n2 -= 1; // now points to the char before the ")"
var c1 = oldBgImg.substring(n1, n1 + 1); // test the first Char after the "("
var c2 = oldBgImg.substring(n2, n2 + 1); // test the first Char after the "("
if ( (c1 == "\"") || (c1 == "\'") ) { n1 += 1; }
if ( (c2 == "\"") || (c2 == "\'") ) { n2 -= 1; }
var oldBgImgPath = oldBgImg.substring(n1, n2 + 1); // [ (" ] .. [ ") ]
var n = oldBgImgPath.lastIndexOf("/");
var newBgImgPath = oldBgImgPath.substring(0, n + 1) + "file2.gif";
// if needed, should also add :
// var path = encodeURI(newBgImgPath);
this.element.css('background-image', 'url(' + newBgImgPath + ')');
注:
下面是一个如何使用正则表达式的示例。- 表达方式:
("?)(http:.*?)\1\)
比赛
url = 'url("http://mySite/images/file1.png")'.match(/("?)(http:.*?)\1\)/)[2];
然后你可以重建你的财产
$(this).css( 'background-image', 'url("' + url + "')" );
这应该适用于所有浏览器。您可以用类似的内容替换
oldBgImg
中的引号
oldBgImg = oldBgImg.replace(/\"/g, "");
这样,无论哪个浏览器检索到URL,URL都是相同的。我用正则表达式实现了这一点。我使用以下代码:
var re = /url\(['"]?(.+?)[^\/]+['"]?\)/;
var regs = re.exec(oldBgImg);
var newBgImgPath = regs[1] + "file2.png";
我来解释原因
/
开头,这表示它是一个REurl\(
),它匹配文本url(
)(
)因为是保留字符而被转义['”]?
['”]
匹配的'
或“
,?
使其成为可选的(
启动可引用的RE组+?
中,匹配除换行符以外的所有字符。+
告诉必须至少有一个或多个字符。最后,?
使+
不贪婪,因此它匹配尽可能少的字符,但仍尝试匹配整个字符)
结束分组[^\/]
匹配任何非/
字符。然后又有一个+
字符。它后面没有?
,因为我们希望尽可能多地匹配末尾的非/
字符(文件名))
用于url(…)
中的结束括号,一个/
用于结束RE现在
re.exec(oldBgImg)
返回一个数组,第一个元素是整个匹配的字符串,下一个元素是匹配的re组(由()
方括号创建)。然后我可以只取regs[1]
,这是第一个匹配的组并包含路径名。使用正则表达式可能更容易些?我知道,您可以在ff中同时使用带引号和不带引号的url。尝试更改它,看看会发生什么!@Homan-我知道。问题是,我尝试更改CSS初始文件中的值,而每个浏览器都处理其di不管有没有引号…谢谢你的详细回答。但是如果我有一个引号呢?如果URL不是以“http”开头怎么办?我正在寻找一个更通用的解决方案。@Atara重新编辑以匹配单引号;已经可以处理不以“http”开头的URL。它只返回URL(
和之间的URL)
在最后一次/
之后没有任何内容。谢谢!我会试试的。