تشغيل Javascript بعد تعيين القيمة المحددة لعنصر التحكم

StackOverflow https://stackoverflow.com/questions/9341

  •  08-06-2019
  •  | 
  •  

سؤال

تطبيق ASP.NET بسيط.

لدي اثنين من عناصر التحكم المنسدلة.في القائمة المنسدلة الأولى لدي جافا سكريبت onChange حدث.يقوم JavaScript بتمكين القائمة المنسدلة الثانية وإزالة قيمة منها (القيمة المحددة في القائمة المنسدلة الأولى).إذا قاموا بالنقر فوق القيمة الأولى الفارغة في القائمة المنسدلة، فسيتم تعطيل القائمة المنسدلة الثانية (وسيتم إعادة تعيين الخيارات).

لدي أيضًا رمز في OnPreRender الطريقة التي ستمكن أو تعطل القائمة المنسدلة الثانية بناءً على قيمة القائمة المنسدلة الأولى.وذلك حتى يمكن تحديد قيمة القائمة المنسدلة الأولى في الكود (تحميل إعدادات المستخدم).

مشكلتي هي:

  1. يختار المستخدم شيئًا ما في القائمة المنسدلة الأولى.سيتم تمكين القائمة المنسدلة الثانية من خلال JavaScript.
  2. ثم يقومون بعد ذلك بتغيير القائمة المنسدلة الثالثة التي تبدأ إعادة النشر.بعد إعادة النشر، تصبح القوائم المنسدلة في الحالة الصحيحة (تم تحديد القيمة الأولى، وتم تمكين القائمة المنسدلة الثانية).
  3. إذا قاموا بعد ذلك بالنقر فوق زر الرجوع، فلن يتم تمكين القائمة المنسدلة الثانية بعد الآن، على الرغم من أنه ينبغي أن يكون كذلك نظرًا لوجود شيء محدد في القائمة المنسدلة الأولى.

لقد حاولت إضافة برنامج نصي لبدء التشغيل (الذي سيحدد الحالة الصحيحة للقائمة المنسدلة الثانية). ClientScript.RegisterStartupScript, ، ولكن عندما يتم استدعاء هذا، تحتوي القائمة المنسدلة الأولى على ملحق selectedIndex ل 0, ، وليس ما هو عليه في الواقع.أعتقد أنه يتم تعيين قيمة التحديد بعد البرنامج النصي للبدء (ولكن لا يزال لا يستدعي onChange النصي).

أي أفكار حول ما يجب تجربته؟

هل كانت مفيدة؟

المحلول

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    protected void indexChanged(object sender, EventArgs e)
    {
        Label1.Text = " I did something! ";
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test Page</title>
</head>
<body>
    <script type="text/javascript">
        function firstChanged() {
            if(document.getElementById("firstSelect").selectedIndex != 0)
                document.getElementById("secondSelect").disabled = false;
            else
                document.getElementById("secondSelect").disabled = true;
        }
    </script>
    <form id="form1" runat="server">
    <div>
        <select id="firstSelect" onchange="firstChanged()">
            <option value="0"></option>
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
        <select id="secondSelect" disabled="disabled">
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
        <asp:DropDownList ID="DropDownList1" AutoPostBack="true" OnSelectedIndexChanged="indexChanged" runat="server">
            <asp:ListItem Text="One" Value="1"></asp:ListItem>
            <asp:ListItem Text="Two" Value="2"></asp:ListItem>    
        </asp:DropDownList>
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
    <script type="text/javascript">
        window.onload = function() {firstChanged();}
    </script>
</body>
</html>

يحرر:تم استبدال الكود بالكامليجب أن يعمل هذا حتى في عنصر تحكم المستخدم الخاص بك.أعتقد أن Register.ClientScriptBlock لا يعمل لأن الكود الذي تكتبه في تلك الكتلة قد تم تنفيذه قبل يتم استدعاء window.onload.وأفترض (لست متأكدًا من هذه النقطة) أن كائنات DOM لم يتم تعيين قيمها في ذلك الوقت.وهذا هو سبب حصولك على الفهرس المحدد كما هو الحال دائمًا 0.

نصائح أخرى

إذا تم تمكين القائمة المنسدلة الثانية في البداية من خلال جافا سكريبت (أفترض أن هذا يحدث أثناء تغيير جافا سكريبت، لأنك لم تحدد ذلك)، فإن النقر على زر الرجوع لإعادة تحميل إعادة النشر السابقة لن يؤدي إلى تمكينها أبدًا.

يمكن أن يكون خلط ASP.NET مع جافا سكريبت الكلاسيكي أمرًا صعبًا.قد ترغب في إلقاء نظرة على تطبيق ASP.NET's Ajax (أو عنصر تحكم AjaxPanel التابع لجهة خارجية إذا كنت مجبرًا على استخدام إصدار ASP.NET أقدم).سيعطيك هذا السلوك الذي تريده من خلال لغة C# النقية، دون إجبارك على اللجوء إلى قرصنة جافا سكريبت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top