- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如果我有这样的风格——
div#testdiv {position:absolute;top:10px !important;}
我可以像这样使用 jQuery 查询 top
值 -
$("#testdiv").css("top");
这将返回值 10px
。是否可以使用 jQuery 或 JavaScript 检查 top
属性是否应用了 !important
属性?
最佳答案
首先,jQuery中似乎不存在这样的解决方案。
提供了许多可用的 javascript 解决方案,使用函数 getPropertyPriority()
。首先,IE6-IE8 不支持此功能(参见 here 和 here)。其次,如果元素的样式未声明内联,则该函数不会直接作用于元素。因此,我们将能够在以下情况下获得重要的属性:
<div id="testdiv" style="top : 10px !important;">Some div</div>
<script type="text/javascript">
// should show 'important' in the console.
console.log(document.getElementById("testdiv").style.getPropertyPriority('top'));
</script>
但是如果我们可以在 css 样式表中声明 #testdiv
的样式,我们将得到一个空字符串。此外,CSSStyleDeclaration
接口(interface)在 IE6-8 中不可用。当然,这种方式毫无用处。我们需要一种不同的方法。
我已将此方法放入 JSFiddle 中.我们可以直接从包含在数组 document.styleSheets[]
中的 css 样式表中读取 !important 属性。 (Opera 8 及以下版本不支持此数组)。在 Quirksmode您可以看到支持访问样式表的方法。根据这些信息,我们可以执行以下操作:
styleSheets[].imports
访问导入的样式表(并以递归方式继续执行此操作,直到我们不再找到任何导入语句),然后使用 styleSheets [].rules
基本上为每个样式表将 css 规则添加到数组。styleSheets[].cssRules
来访问导入规则和 css 规则。我们通过检查它是否实现了 CSSImportRule 接口(interface)来检测导入规则,并使用它们以递归方式访问导入样式表中的 css 规则。在这两种情况下,我们仅在规则与 HTMLElement 匹配时才将 css 规则添加到数组(在您的情况下为 #testdiv
)。这会生成一组与 HTMLElement 匹配的 css 规则。这基本上就是 webkit 浏览器中的 getMatchedCSSRules()
函数所做的。然而,我们在这里自己写。
根据这些信息,我们编写了我们的 hasImportant(htmlNode, property)
函数,其中 htmlNode 是一个 HTMLElement(您的 testdiv),属性是 css 属性(在您的例子中为“top”)。首先,我们检查 top 属性的内联样式是否有一个重要的属性。如果它确实包含此属性,这将节省我们查看样式表的时间。
我们编写了一个新函数 isImportant(node, property)
,它使用了我们很好的旧函数 node.style.getPropertyPriority(property)
。但是,就像我之前在这个答案中提到的:IE6-IE8 不支持此功能。我们可以自己编写函数:在 IE 中,属性 node.style.cssText
包含声明 block 文本。我们在此文本 block 中搜索属性 ('top') 并检查其值是否包含 '!important'。我们可以在使用 getMatchedCSSRules
函数获得的每个 css 规则上重用此函数,方法是遍历与 htmlNode 匹配的所有 css 规则并调用 isImportant 函数。
以上所有内容都可以在下面的代码中找到。这是基本方法,可能应该进一步微调:
可能有更简单的方法,但我不知道有任何其他方法可以让这个跨浏览器正常工作。
var debug = true;
/**
* Get the css rules of a stylesheet which apply to the htmlNode. Meaning its class
* its id and its tag.
* @param CSSStyleSheet styleSheet
* @param HTMLElement htmlNode
*/
function getCssRules(styleSheet, htmlNode) {
if ( !styleSheet )
return null;
var cssRules = new Array();
if (styleSheet.cssRules) {
var currentCssRules = styleSheet.cssRules;
// Import statement are always at the top of the css file.
for ( var i = 0; i < currentCssRules.length; i++ ) {
// cssRules all contains the import statements.
// check if the rule is an import rule.
if ( isImportRule(currentCssRules[i]) ) {
// import the rules from the imported css file.
var importCssRules = getCssRules(currentCssRules[i].styleSheet, htmlNode);
if ( importCssRules != null ) {
// Add the rules from the import css file to the list of css rules.
cssRules = addToArray(cssRules, importCssRules, htmlNode);
}
// Remove the import css rule from the css rules.
styleSheet.deleteRule(i);
}
else {
// We found a rule that is not an CSSImportRule
break;
}
}
// After adding the import rules (lower priority than those in the current stylesheet),
// add the rules in the current stylesheet.
cssRules = addToArray(cssRules, currentCssRules, htmlNode);
}
else if (styleSheet.rules) {
// IE6-8
// rules do not contain the import statements.
var currentCssRules = styleSheet.rules;
// Handle the imports in a styleSheet file.
if ( styleSheet.imports ) {
// IE6-8 use a seperate array which contains the imported css files.
var imports = styleSheet.imports;
for ( var i = 0; i < imports.length; i++ ) {
var importCssRules = getCssRules(imports[i], htmlNode);
if ( importCssRules != null ) {
// Add the rules from the import css file to the list of css rules.
cssRules = addToArray(cssRules, importCssRules, htmlNode);
}
}
}
// After adding the import rules (lower priority than those in the current stylesheet),
// add the rules in the current stylesheet.
cssRules = addToArray(cssRules, currentCssRules, htmlNode);
}
return cssRules;
}
/**
* Since a list of rules is returned, we cannot use concat.
* Just use old good push....
* @param CSSRuleList cssRules
* @param CSSRuleList cssRules
* @param HTMLElement htmlNode
*/
function addToArray(cssRules, newRules, htmlNode) {
for ( var i = 0; i < newRules.length; i++ ) {
if ( htmlNode != undefined && htmlNode != null && isMatchCssRule(htmlNode, newRules[i]) )
cssRules.push(newRules[i]);
}
return cssRules;
}
/**
* Matches a htmlNode to a cssRule. If it matches, return true.
* @param HTMLElement htmlNode
* @param CSSRule cssRule
*/
function isMatchCssRule(htmlNode, cssRule) {
// Simply use jQuery here to see if there cssRule matches the htmlNode...
return $(htmlNode).is(cssRule.selectorText);
}
/**
* Verifies if the cssRule implements the interface of type CSSImportRule.
* @param CSSRule cssRule
*/
function isImportRule(cssRule) {
return cssRule.constructor.toString().search("CSSImportRule") != -1;
}
/**
* Webkit browsers contain this function, but other browsers do not (yet).
* Implement it ourselves...
*
* Finds all matching CSS rules for the htmlNode.
* @param HTMLElement htmlNode
*/
function getMatchedCSSRules(htmlNode) {
var cssRules = new Array();
// Opera 8- don't support styleSheets[] array.
if ( !document.styleSheets )
return null;
// Loop through the stylesheets in the html document.
for ( var i = 0; i < document.styleSheets.length; i++ ) {
var currentCssRules = getCssRules(document.styleSheets[i], htmlNode)
if ( currentCssRules != null )
cssRules.push.apply(cssRules, currentCssRules);
}
return cssRules;
}
/**
* Checks if the CSSStyleRule has the property with 'important' attribute.
* @param CSSStyleRule node
* @param String property
*/
function isImportant(node, property) {
if ( node.style.getPropertyPriority && node.style.getPropertyPriority(property) == 'important' )
return true;
else if ( node.style.cssText && getPropertyPriority(node.style.cssText, property) == 'important' ) {
// IE6-8
// IE thinks that cssText is part of rule.style
return true;
}
}
/**
* getPropertyPriority function for IE6-8
* @param String cssText
* @param String property
*/
function getPropertyPriority(cssText, property) {
var props = cssText.split(";");
for ( var i = 0; i < props.length; i++ ) {
if ( props[i].toLowerCase().indexOf(property.toLowerCase()) != -1 ) {
// Found the correct property
if ( props[i].toLowerCase().indexOf("!important") != -1 || props[i].toLowerCase().indexOf("! important") != -1) {
// IE automaticaly adds a space between ! and important...
return 'important'; // We found the important property for the property, return 'important'.
}
}
}
return ''; // We did not found the css property with important attribute.
}
/**
* Outputs a debug message if debugging is enabled.
* @param String msg
*/
function debugMsg(msg) {
if ( debug ) {
// For debugging purposes.
if ( window.console )
console.log(msg);
else
alert(msg);
}
}
/**
* The main functionality required, to check whether a certain property of
* some html element has the important attribute.
*
* @param HTMLElement htmlNode
* @param String property
*/
function hasImportant(htmlNode, property) {
// First check inline style for important.
if ( isImportant(htmlNode, property) ) {
// For debugging purposes.
debugMsg("Inline contains important!");
return true;
}
var rules = getMatchedCSSRules(htmlNode);
if ( rules == null ) {
debugMsg("This browser does not support styleSheets...");
return false;
}
/**
* Iterate through the rules backwards, since rules are
* ordered by priority where the highest priority is last.
*/
for ( var i = rules.length; i-- > 0; ) {
var rule = rules[i];
if ( isImportant(rule, property) ) {
// For debugging purposes.
debugMsg("Css contains important!");
return true;
}
}
return false;
}
$(document).ready(function() {
hasImportant($('#testdiv')[0], 'top');
});
关于javascript - 检查 css 属性是否应用了 !important 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314131/
我需要根据需要动态设置文本区域,但它不想正常工作。 JQuery 会自行检查,但无法检查是否已检查。但是当您在第二个单选框内单击时,始终需要文本区域。我尝试了很多次让它工作,但它仍然有问题。我添加了“
我需要在 Django 中进行 API 调用(某种形式),作为我们所需的自定义身份验证系统的一部分。用户名和密码通过 SSL 发送到特定 URL(对这些参数使用 GET),响应应该是 HTTP 200
我将在我的可移植 C 代码中使用 #warning 来生成编译时警告。但并非所有平台都支持 #warning。有什么方法可以找到该平台是否支持 #warning。 #ifdef warning
我编写了一个函数来检查某个数字是否存在于某个区间内。停止搜索的最佳方法是什么?这个: for (i = a; i <= b; i++) { fi = f(i); if (fi == c) {
我想知道在 c 中是否有一种方法可以检查,例如在 for 函数中,如果变量等于或不等于某些字符,而不必每次都重复进行相等性检查。如果我没记错的话,以这种方式检查相等性是不正确的: if (a == (
我有如下日志功能 void log_error(char * file_name, int line_num, int err_code) { printf("%s:%d:%s\n", fil
使用 ssh-keygen 生成的 key 对在 macOS 上可以有不同的格式。 macOS 可读的标准 PEM ASN.1 对象 SecKey API 带有文本标题的 PEM OpenSSH ke
我正在尝试编写一个 excel if 语句。我不熟悉使用 Excel 具有的所有额外功能。我正在使用一个名为 importXML() 的函数.我正在尝试检查我正在使用的函数是否生成“#VALUE!”错
有没有办法检查是否没有 AIO 写入给定文件?我在我的 Unix 类(class)上制作了一个项目,该项目将是一个上下文无关(基于 UDP)的国际象棋服务器,并且所有数据都必须存储在文件中。应用程序将
我有一个如下所示的函数: public Status execute() { Status status = doSomething(); if (status != Stat
我正在使用 Composer,我不希望 PhpStorm 在 vendor 文件夹上运行任何错误检查或检查,因为它对 vendor/中的某些代码显示误报composer/autoload_static
Chapel 的一个很好的特性是它区分了数组的域和它的分布。检查两个数组是否具有相同的域和分布(通常想要的)的最佳方法是什么? 我能看到的最好的方法是检查 D1==D2和 D1.dist==D2.di
在我的 JavaScript 函数中,我为所有输入、文本区域和选择字段提供实际值作为 initial_value: $('input, textarea, select').each(function
我正在编写一个分解为几个简单函数的 PHP 类。在构造函数中,它调用另一个名为 processFile 的函数。该函数调用 5 个私有(private)函数并进行检查。如果检查失败,它会将消息分配给
这个问题已经有答案了: How to detect if user it trying to open a link in a new tab? (2 个回答) 已关闭 7 年前。 我认为 JavaS
我正在浏览我们的代码库并看到很多这样的测试: declare @row_id int = ... declare @row_attribute string select @row_attribu
我正在声明一个用作比较的函数。我的问题是: 为什么条件充当语句? 为什么第 4 行可以工作,而第 5 行却不行? 我知道这段代码不切实际且未使用,但为什么编译器允许这种语法? 谷歌没有找到答案。但话又
到目前为止,我有一个带有空文本字段的 PHP Kontaktform,并使用以下命令检查了所需的字段: $name = check_input($_POST['name'], "请输入姓名。"); 现
目前,我能想到的合理检查的唯一方法没有臃肿的逻辑: if ( $value > 0 ) { // Okay } else { // Not Okay } 有没有更好的办法? 最佳答案
我正在尝试运行一个脚本,如果 i 存在(意味着存在 i 值,任何值)或其他部分,我希望运行其中的一部分如果i没有值就运行,有人可以启发我吗? 我说的是 for 循环,比如 for (var i=0;
我是一名优秀的程序员,十分优秀!