Есть ли кросс-браузерный способ использования селектора jQuery для свойства expando? - PullRequest
1 голос
/ 02 сентября 2010

У меня есть страница ASP.NET, и я пытаюсь быстро сопоставить элементы управления проверкой, которые привязаны к определенному текстовому полю (ввод текста) с помощью селектора jQuery. Элементы управления проверкой отображаются в виде span, а свойство controltovalidate - в качестве свойства expando. Вот тестовый пример:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <script type="text/javascript" src="jquery.js"></script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1"
            ErrorMessage="RequiredFieldValidator"></asp:RequiredFieldValidator>

        <asp:Button ID="Button1" runat="server" Text="Button" /></div>

        <input type="button" value="Test" onclick="ml_test();" />

        <script type="text/javascript">
            ml_test = function() {
                alert($('[controltovalidate=TextBox1]').get().length);
            };
        </script>

    </form>
</body>
</html>

Отображается как:

(code removed here)

        <input name="TextBox1" type="text" id="TextBox1" />
        <span id="RequiredFieldValidator1" style="color:Red;visibility:hidden;">RequiredFieldValidator</span>
        <span id="RegularExpressionValidator1"></span>

        <input type="submit" name="Button1" value="Button" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;Button1&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="Button1" /></div>

        <input type="button" value="Test" onclick="ml_test();" />

        <script type="text/javascript">
            ml_test = function() {
                alert($('[controltovalidate=TextBox1]').get().length);
            };
        </script>

(code removed here)

<script type="text/javascript">
//<![CDATA[
var RequiredFieldValidator1 = document.all ? document.all["RequiredFieldValidator1"] : document.getElementById("RequiredFieldValidator1");
RequiredFieldValidator1.controltovalidate = "TextBox1";
RequiredFieldValidator1.errormessage = "RequiredFieldValidator";
RequiredFieldValidator1.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
RequiredFieldValidator1.initialvalue = "";
//]]>
</script>

Проблема: функция ml_test () показывает 1 в Internet Explorer 7 (как и ожидалось), но показывает 0 в Firefox 3.6.8. Я попытался добавить дополнительные элементы управления, но в Firefox он постоянно не работает.

Я обнаружил этот пост , который показывает использование амперсанда в селекторе, подобном этому [@expando=value], но когда я пробую этот синтаксис, jQuery 1.4.2 выдает ошибку.

Существует ли кросс-браузерный способ выбора атрибутов expando, и если да, то какой правильный синтаксис?

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Вы можете использовать .filter() так:

ml_test = function() {
    alert($('span').filter(function() { return this.controltovalidate=='TextBox1'; }).length);
};

Вы можете проверить его здесь или сделать его произвольным, например:

jQuery.expr[':'].validatorFor = function(o, i, m){
  return o.controltovalidate === m[3];
};​

И назовите это так:

ml_test = function() {
    alert($('span:validatorFor(TextBox1)').length);
};

Вы можете эту версию здесь .

0 голосов
/ 02 сентября 2010

Вы ищете промежуток, который показывает сообщение проверки, если оно недействительно?

Если это так, попробуйте это: (с помощью jQuery)

ml_test = function() {
    alert($('RequiredFieldValidator1').length);
};

Если вы хотите также иметь возможность видетькакой контроль он проверяет, сделайте что-то вроде этого:

ml_test = function() {

    // getting the control with jQuery by its ID.  .Net already has it
    // defined in the script block that is generated by the 
    // RequiredFieldValidator control
    var validateCtrl = $(RequiredFieldValidator1.id);  

    // get the value from the .Net-defined validator variable
    var controlToValidate = RequiredFieldValidator1.controltovalidate;

    // alert the values:
    alert('RequiredValidatorControl count: ' + validator.length + 
          '\nControl To Validate: ' + controlToValidate);

};
...