اذهب إلى المحتوى

Mohammed Hhhh

الأعضاء
  • المساهمات

    219
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    1

أجوبة بواسطة Mohammed Hhhh

  1. بتاريخ 4 دقائق مضت قال Kais Hasan:

    يمكنك مثلاً عند عملية الحذف أن تقوم بتصغير الذي يحوي على المهمة التي يتم حذفها و ذلك تدريجياً، فيظهر لك إحساس بأنها ترتفع بشكل تدريجي و ليس بشكل مباشر.

    أي أنك في عملية الحذف يتم استدعاء تابع يقوم بالحذف مع ال animation الذي يظهر في الفيديو الخاص بك، في نفس هذا التابع يمكنك بدل ان تحذف المكون بشكل مباشر ( و الذي سيؤدي إلى ارتفاع مباشر للمهمة التي في الأسفل) أن تقوم بتصغير حجم المكون الذي يحويه بشكل تدريجي مما سيؤدي إلى المطلوب.

    يوجد طرق عديدة أخرى و لكن الطريقة التي تحدثت عنها عامة بغض النظر عما تقوم باستعماله.

    لم يعمل

    Desktop_2022_09.25_-_09_18_04_02.mp4

    ششش.png

  2. لدي مشكله في برنامجي هي اني عندما اقوم بأزالة مهمه تختفي ولكن المهمه التي اسفلها لا تنتقل بشكل سلس بالتقوم بالأرتفاع مباشره ما حل ذلك موضوح في  الفيديو

    My Video.gif

     

    الاكواد

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <link rel="preconnect" href="https://fonts.googleapis.com">
      <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
      <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
      <link rel="stylesheet" href="style.css">
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"
        integrity="sha512-xh6O/CkQoPOWDdYTDqeRdPCVd1SpvCA9XXcUnZS2FmJNp1coAFzvtCN9BmamE+4aHK8yyUHUSCcJHgXloTyT2A=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
      <title>To Do List</title>
    </head>
    
    <body>
    
      <header>To do List</header>
      <form action="">
        <input class="txt" id="txt" type="text" placeholder="Please Write Here!" id="todo_txt">
        <button type="submit" id="submit_todo"><i class="fa-solid fa-square-plus"></i></button>
      </form>
    
      <div class="availabel"></div>
    
      <ul class="tasks" id="ul">
    
        <!-- js -->
    
      </ul>
    
    
      <script src="main.js"></script>
    </body>
    
    </html>
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-family: 'Poppins', sans-serif;
        transition: all ease;
        -webkit-transition: all ease;
        -moz-transition: all ease;
        -ms-transition: all ease;
        -o-transition: all ease;
    }
    body{
        transition: all 2s ease ;
        -webkit-transition: all 2s ease ;
        -moz-transition: all 2s ease ;
        -ms-transition: all 2s ease ;
        -o-transition: all 2s ease ;
    }
    header {
        width: 100%;
        height: 5vh;
        background-color: rgb(39, 39, 39);
        color: white;
        padding: 20px;
        display: flex;
        align-items: center;
    }
    
    form {
        margin: 50px;
        width: 100%;
        height: 5vh;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    
    .txt {
        padding: 5px;
        margin: 10px;
        width: 500px;
    }
    
    form button {
    
        width: 100px;
        font-size: 20px;
    
    }
    
    .tasks {
        min-width: 100%;
        /*background-color: rgb(103, 103, 103);
        */padding: 30px;
        color: white;
        transition: all ease 2s ;
        -webkit-transition: all ease 2s ;
        -moz-transition: all ease 2s ;
        -ms-transition: all ease 2s ;
        -o-transition: all ease 2s ;
    }
    
    .singil_task {
        min-width: 100%;
        display: flex;
        justify-content: space-evenly;
        align-items: center;
        margin: 5px;
        background-color: rgb(23, 23, 23);
        padding: 30px;
        border-radius: 10px;
        -webkit-border-radius: 10px;
        -moz-border-radius: 10px;
        -ms-border-radius: 10px;
        -o-border-radius: 10px;
        transition: all ease 0.5s;
        -webkit-transition: all ease 0.5s;
        -moz-transition: all ease 0.5s;
        -ms-transition: all ease 0.5s;
        -o-transition: all ease 0.5s;
    }
    
    p {
        max-width: 50%;
        min-width: 50%;
        overflow: hidden;
    }
    
    .icons {
        min-width: 74px;
        font-size: 24px;
    }
    
    .icons i {
        transition: all ease 0.5s;
        -webkit-transition: all ease 0.5s;
        -moz-transition: all ease 0.5s;
        -ms-transition: all ease 0.5s;
        -o-transition: all ease 0.5s;
    }
    
    .fa-circle-xmark:hover {
        color: red;
    }
    
    .fa-circle-check:hover {
        color: green;
    }
    
    .availabel {
        text-align: center;
        position: absolute;
        width: 210px;
        height: 45px;
        top: 115px;
        right: 0;
    }
    
    h5 {
        animation: animationv ease 1.2s;
        -webkit-animation: animationv ease 1.2s;
    }
    
    .singil_task {
        animation: animationc ease 1s;
        -webkit-animation: animationc ease 1s;
    }
    
    @keyframes animationc {
        0% {
            opacity: 0.5;
            transform: perspective(700px) translate(0px, 80px);
            transform-origin: center center;
        }
    
        100% {
            opacity: 1;
    
            transform: perspective(700px);
            transform-origin: center center;
    
        }
    }
    
    @keyframes animationv {
        0% {
            opacity: 0.5;
            transform: perspective(700px) translate(0px, 80px);
            transform-origin: center center;
        }
    
        50% {
            opacity: 1;
    
            transform: perspective(700px);
            transform-origin: center center;
    
        }
    
        100% {
            opacity: 0;
            transform: perspective(700px) translate(0px, 80px);
            transform-origin: center center;
        }
    }
    
    .done {
        opacity: 0.2;
        background-color: green;
        color: black;
    }
    
    .remove{
        opacity: 0;
        transform: scale(2);
        -webkit-transform: scale(2);
        -moz-transform: scale(2);
        -ms-transform: scale(2);
        -o-transform: scale(2);
    }
    let task_title = document.getElementById("txt");
    let submit_btn = document.getElementById("submit_todo");
    let availabel = document.querySelector(".availabel");
    
    submit_btn.onclick = function (e) {
        e.preventDefault();
    
        if (task_title.value != "") {
            let ul = document.getElementById("ul");
    
            let li = document.createElement("li");
            li.classList.add("singil_task");
    
            let p = document.createElement("p");
            p.textContent = task_title.value;
    
            let div_icons = document.createElement("div");
            div_icons.classList.add("icons");
    
            div_icons.innerHTML = `
    <i class="fa-circle-check fa-sharp fa-solid "></i>
    <i class="fa-circle-xmark fa-solid" style="padding-left: 15px;"></i>
    `;
    
            li.appendChild(p);
            li.appendChild(div_icons);
            ul.appendChild(li);
            task_title.value = "";
    
            let cheak = li.querySelector(".fa-circle-check");
            cheak.addEventListener("click", function () {
                li.classList.toggle("done");
            });
            let deleteBtn = li.querySelector(".fa-circle-xmark");
            deleteBtn.addEventListener("click", function () {
                li.classList.add("remove");
                li.addEventListener('transitionend' , _ =>{
                    li.remove();
                })
    
            });
        } else {
            let h5 = document.createElement("h5");
            h5.textContent = "please enter a task";
            h5.style.color = "red";
            h5.style.display = "block";
            h5.style.padding = "10px";
    
            availabel.appendChild(h5);
            setTimeout((_) => {
                h5.remove();
            }, 1000);
        }
    };

     

    • أعجبني 1
  3. بتاريخ 30 دقائق مضت قال علي محسن:

    إذا فتحت الكونسول بعد فتح الصفحة ستجد خطأ مفاده أنك تحاول الإنصات addEventListener الى عنصر غير موجود تسميه في الكود الخاص بك بمتغير cheak وهذا لأنك تحاول الوصول الى هذا العنصر مبكراً قبل أن يوجد أصلا لأنك تقوم بإنشاء عناصر li من خلال إضافتها بالإستعانة بجافاسكريت وليس قبل أن يتم تحميل الصفحة. لحل المشكلة قم بإجراء التعديلات التالية على الكود الخاص بك وستعمل لديك خاصية الحذف وأيضا إكمال المهمات.

    
    // إحذف هذا الجزء من الكود لأنه لايعمل
    // cheak.addEventListener("onclick" , function(){
    //     li.classList.add("done");
    // })
    ...
    //بكامل محتوياته كما نقوم بإضافة الصنف الذي يعمل تنسيق معين يظهر لنا العنصر قد تم إنهاءه. إذا لم تنشئ هذا الصنف بعد يمكنك إنشاءه li قم بتعديل هذا الجزء ليصبح الكود فعالاً حيث تلاحظ أننا نحذف العنصر
    // i هنا نربط الحذف والإكمال بالنقر على العنصر 
    <i onclick="this.classList.add('done');" class="fa-circle-check fa-sharp fa-solid "></i>
    <i onclick="li.remove()" class="fa-circle-xmark fa-solid" style="padding-left: 15px;"></i>
    ...
    	

    برجاء ارسال الكود كامل عشان افهم

  4. بتاريخ 37 دقائق مضت قال Hassan Hedr:

    المشكلة لديك أنك تحاول الاستعلام عن زر انتهاء المهمة عند تحميل الصفحة مباشرة، وذلك غير ممكن لأن المهمة لم تٌضاف بعد، الحل يكون بإنشاء عنصر li داخل حدث الاضافة وليس خارجه، والاستعلام عن زر انهاء المهمة بعد ذلك مباشرة، ثم ربط الحدث click وليس onclick به لتنفيذ عملية الانهاء كالتالي:

    
    submit_btn.onclick = function (e) {
      let li = document.createElement("li"); // انشاء عنصر المهمة
      ...
    
      let cheak = li.querySelector(".fa-circle-check"); // الاستعلام عن الأزرار
      cheak.addEventListener("click", ..); // ربط حدث ضغط الزر
      
      // بنفس الطريقة لزر الحذف
      // ..
    }

     

    لم افهم و انا المشكله عندي كيف احدد العنصر عشان احذفه 

  5. انا لدي مشكله في مشروعي قمت بعمل اضافه لل مهام و لكن مهمة الحذف و الـــ النتهاء من المهمه لا تعمل ما السبب و شكرا 

    html 

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <link rel="preconnect" href="https://fonts.googleapis.com">
      <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
      <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
      <link rel="stylesheet" href="style.css">
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"
        integrity="sha512-xh6O/CkQoPOWDdYTDqeRdPCVd1SpvCA9XXcUnZS2FmJNp1coAFzvtCN9BmamE+4aHK8yyUHUSCcJHgXloTyT2A=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
      <title>To Do List</title>
    </head>
    
    <body>
    
      <header>To do List</header>
      <form action="">
        <input class="txt" id = "txt" type="text" placeholder="Please Write Here!" id="todo_txt">
        <button type="submit" id="submit_todo"><i class="fa-solid fa-square-plus"></i></button>
      </form>
    
      <div class="availabel"></div>
    
      <ul class="tasks" id = "ul">
    
        <!-- js -->
        
      </ul>
    
    
      <script src="main.js"></script>
    </body>
    
    </html>

    css

    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-family: 'Poppins', sans-serif;
        transition: all ease;
        -webkit-transition: all ease;
        -moz-transition: all ease;
        -ms-transition: all ease;
        -o-transition: all ease;
    }
    
    header {
        width: 100%;
        height: 5vh;
        background-color: rgb(39, 39, 39);
        color: white;
        padding: 20px;
        display: flex;
        align-items: center;
    }
    
    form {
        margin: 50px;
        width: 100%;
        height: 5vh;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    
    .txt {
        padding: 5px;
        margin: 10px;
        width: 500px;
    }
    
    form button {
    
        width: 100px;
        font-size: 20px;
    
    }
    
    .tasks {
        min-width: 100%;
        background-color: rgb(103, 103, 103);
        padding: 30px;
        color: white;
    }
    
    .singil_task {
        min-width: 100%;
        display: flex;
        justify-content: space-evenly;
        align-items: center;
        margin: 5px;
        background-color: rgb(23, 23, 23);
        padding: 30px;
        border-radius: 10px;
        -webkit-border-radius: 10px;
        -moz-border-radius: 10px;
        -ms-border-radius: 10px;
        -o-border-radius: 10px;
    }
    
    p {
        max-width: 50%;
        min-width: 50%;
        overflow: hidden;
    }
    
    .icons {
        min-width: 74px;
        font-size: 24px;
    }
    
    .icons i {
        transition: all ease 0.5s;
        -webkit-transition: all ease 0.5s;
        -moz-transition: all ease 0.5s;
        -ms-transition: all ease 0.5s;
        -o-transition: all ease 0.5s;
    }
    
    .fa-circle-xmark:hover {
        color: red;
    }
    
    .fa-circle-check:hover {
        color: green;
    }
    
    .availabel {
        text-align: center;
        position: absolute;
        width: 210px;
        height: 45px;
        top: 115px;
        right: 0;
    }
    
    h5 {
        animation: animationv ease 1.2s;
        -webkit-animation: animationv ease 1.2s;
    }
    
    .singil_task {
        animation: animationc ease 0.5s;
    }
    
    @keyframes animationc {
        0% {
            opacity: 0.5;
            transform: perspective(700px) translate(0px, 80px);
            transform-origin: center center;
        }
    
        100% {
            opacity: 1;
    
            transform: perspective(700px);
            transform-origin: center center;
    
        }
    }
    
    @keyframes animationv {
        0% {
            opacity: 0.5;
            transform: perspective(700px) translate(0px, 80px);
            transform-origin: center center;
        }
    
        50% {
            opacity: 1;
    
            transform: perspective(700px);
            transform-origin: center center;
    
        }
    
        100% {
            opacity: 0;
            transform: perspective(700px) translate(0px, 80px);
            transform-origin: center center;
        }
    }
    
    .done{
        opacity: 0.2 ;
        background-color: green ;
        color: black ;
    }

    JS

    let task_title = document.getElementById("txt");
    let submit_btn = document.getElementById("submit_todo");
    let availabel = document.querySelector(".availabel");
    
    // proplem!!
    let cheak = document.querySelector(".fa-circle-check");
    //----
    
    let li = document.createElement("li");
    
    submit_btn.onclick = function (e) {
        e.preventDefault();
    
        if (task_title.value != "") {
    
            let ul = document.getElementById("ul");
    
            li.classList.add("singil_task");
    
            let p = document.createElement("p");
            p.textContent = task_title.value;
    
            let div_icons = document.createElement("div");
            div_icons.classList.add("icons");
    
            div_icons.innerHTML = `
    
    
            <i class="fa-circle-check fa-sharp fa-solid "></i>
            <i class="fa-circle-xmark fa-solid" style="padding-left: 15px;"></i>
    
    
        `
    
            li.appendChild(p);
            li.appendChild(div_icons);
            ul.appendChild(li);
            task_title.value = "";
    
        } else {
            let h5 = document.createElement("h5");
            h5.textContent = "please enter a task"
            h5.style.color = "red";
            h5.style.display = "block";
            h5.style.padding = "10px";
    
            availabel.appendChild(h5);
            setTimeout(_ => { h5.remove() }, 1000)
        }
    }
    
    
    // proplem
    // proplem
    cheak.addEventListener("onclick" , function(){
        li.classList.add("done");
    })
    // proplem
    // proplem

    مع الملاحظه بأن المشطله بالأسفل

    • أعجبني 2
  6. how to remove char from string with out using functions  in 

    لقد حاولت ان اقوم بأزالة char من ال string  في سي بلس بلس  و لم ينفع هذا هو كودي :

        string sss = "    ";
        
        for (int i = 0; i <= 4; i++) {
            sss[i] = '';
            cout << endl; 
        }
        cout << sss; 

     

    Screenshot 2022-08-26 145010.png

    • أعجبني 2
  7. بتاريخ 1 ساعة قال عمر قره محمد:

    target هو العنصر الذي يحصل الـ event عليه، فبالمثال الخاص بك هنا هو العنصر الذي يتم النقر عليه.

    والـ event أو ما يتم اختصاره عادةً بـ e هو عبارة عن كائن يعبر عن الحدث، وفي هذه الحالة يعبر عن حدث النقر،
    وهو يعطيك العديد من المعلومات عن حدث النقر، فمثلا يقول لك احداثيات المكان الذي نقرت عليه بالنسبة لمحور الـ x ولمحور الـ y وكذلك بعد المكان النقر عن حواف الشاشة، وكذلك يخبرك بالعنصر target وهو العنصر الذي تم النقر عليه.
    فإذا قمت بإضافة ال event المسمى click للعنصر body و قمت بالنقر على اي عنصر بالصفحة سيخبرك الكود التالي بالعنصر الذي قمت بالنقر عليه :

    
    document.body.addEventListener("click" , function(event) {
        console.log(event.target)
    })

    وهذه مقالة موسعة تتحدث عن الموضوع :

    اعرف اكثر عن العنصر event من حسو

    ولكن كان بأمكانه تنفيذ الكود بدونها اليس كذالك  --, target

    (شكرا لك افضل الشرح باللغه العامه) 

    و ايضا انا اعرف ان لل target كثير من الخصائص مثل tagName , nodeTagname

    • أعجبني 1
  8. بتاريخ 19 دقائق مضت قال Adnane Kadri:

    هي مضافة بالفعل، أنت لم تقم بحقن الناتج الى عنصر body لتختبر الناتج فقط. جرب تحديد body واضافة العنصر li اليه وسترى انها مضافة.

    
    li.appendChild(a);
    
    document.body.appendChild(li);
    
    console.log(li);

    يمكنك ايضا طباعة محتوى ال HTML الخاص بالعنصر li لرؤية الناتج:

    
    a.innerHTML = `<p>mohammed is dev</p>`
    li.appendChild(a);
    
    console.log(li.innerHTML);

    لأن طباعة li مباشرة ستعطي كائنا عن الصنف HTMLLIElement فقط.

    اذا لماذا في هذه الصوره نجحت الطريقه 

    new.png

  9. لماذا لم تضاف ال a الى الأ[ li

    let li = document.createElement('li') ;
    
    li.className = "new_li" ;
    li.setAttribute("style","background-color: red ;") ; 
    li.appendChild(document.createTextNode("hello iam mohammed"))
    // append child to li 
    
    let a = document.createElement('a');
    a.innerHTML = `<p>mohammed is dev</p>`
    li.appendChild(a);  
    
    console.log(li);
    • أعجبني 1
  10. كيف يستطيع ال forEach استدعاء نفسه (ال فنكشن الذي بداخله و كيف تم تحديد ما ذا يفعل البراميتر) من غير ما استدعيه انا بنفسي مثل ال function  العاديه 

    مثال 

    let cars = ["ford" , "toyota" , "dodge" , "range rover"]; 
    
    // simpel function 
    
    function simple_func(newDate){
      console.log(`this is the date today ${newDate}`) ; 
    }
    simple_func(Date())
    // --------
    console.log("------------------");
    // --------
    // ال for  العاديه
    
    for(let i = 0 ; i <= cars.length-1 ; i++){
      console.log(`this is my cars 0-0> ${cars[i]}`)
    }
    
    // --------
    console.log("------------------");
    // --------
    
    // ال forEach 
    
    cars.forEach(function(my_cars){
      console.log(`this is my cars 0-0>${my_cars}`)
      // لماذا لا يجب استدعاء الفنكشن
    });
    // --------
    console.log("------------------");
    // --------

     

    • أعجبني 1
  11. بتاريخ 29 دقائق مضت قال محمد عاطف11:

    مرحبا أخى .

    new تستخدم لبناء الكائنات وهى تقوم بارجاع كائن من النوع التالى لها .

    يمكنك قرائة المقال التالى لفهم طريقة عملها وفيما تستخدم .

    https://academy.hsoub.com/programming/javascript/الباني-والعامل-new-في-جافاسكربت-r801/

    طيب انا استطيع كتابة Date() بدون new ما الفرق

  12. بتاريخ 7 دقائق مضت قال Wael Aljamal:

    الشيفرة المرفقة مجربة، وفي حال ظهر لك خطأ يمكنك إرفاقه، و ذكرت أنني قمت بتعديل المجال للارقام لتوضيح عملية الإنشاء العشوائي للقيم المختلفة.

    صحيح لقد اخطأت انا شيفرتكت صحيحه و لكن انا اريد ان تمر فقط بي 1  //  3 و اريد ان يلف اللوب فقط 3 لفات و شكرا

  13. بتاريخ On 6/23/2022 at 19:48 قال Wael Aljamal:

    سبب المشكلة أن تقوم بضبط مولد العدد العشوائي بنفس القيمة الابتدائية ضمن كل تكرار للحلقة، ما يعمل على تثبيت هذه القيمة. أي عند جلب عدد عشوائي مرى أخرى ستكون نفسها.

    • الحل هو نقل srand لقبل الحلقة فيتم تهيئته مرة واحدة
    • مجالك للأعداد صغير بطول 3 لذلك تكرار قيمة منه احتماله عال..
    
    #include <iostream>
    
    using namespace std;
    
    int main(){
    
        int a;
        int list_of_random_numbers[4];
        srand(time(0));
        for (int s = 0; s <= 10; s++) {
    
            a = rand() % 100;
            cout << a ;
            list_of_random_numbers[s] = a;
           // cout << "random number --> " << list_of_random_numbers[s]; 
            cout << endl;
    
        }
    
        return 0;
    }

    النتيجة بحال توسعة المجالات وعدد الأعداد العشوائية التي يتم إنشائها.

    
    67
    0
    93
    66
    13
    41
    93
    27
    93
    94
    36

     

    السلام عليكم \

    الكود لا يعمل لا اعلم ما هو السبب ثانيا انا اريد ان LOOP تلف 3 مرات و في هذه ال 3 مرات تعطيني 3 ارقام غير مرتبه من رقم  1 الى 3 بأستخدام ال RAND و شكرا 

  14. السلام عليكم ورحمة الله وبركاته 

    الآن هنا لدي مشكله في هذا البرنامج 

    اريد مع كل لوب يعمله ال for-loop يتغير ال random - number  فــ ما هو الخطأ الذي لدي في هذا الكود

    #include <iostream>
    
    using namespace std;
    
    int main(){
    
        int a;
        int list_of_random_numbers[4];
        for (int s = 0; s <= 3; s++) {
    
            srand(time(0));
            a = rand() % 3;
            list_of_random_numbers[s] = a;
            cout << "random number --> " << list_of_random_numbers[s]; 
            cout << endl;
    
        }
    
        return 0;
    }

     

    • أعجبني 1
  15. بتاريخ 2 دقائق مضت قال Adnane Kadri:

    ماذا عن قسم جافاسكربت في موسوعة ويكي حسوب؟

    تهدف موسوعة حسوب لتوفير توثيق عربي كامل وعالي الجودة، مدعم بالأمثلة لمختلف لغات البرمجة وتقنيات تطوير الويب والجوال. محتوى موسوعة حسوب هو محتوى مرجعي، أي هو أقرب للقاموس تبحث فيه عمّا تحتاج له عند الحاجة ان كنت تواجه أي مشاكل برمجية او تساؤلات يمكنك الاستعانة بموقع أكاديمية حسوب.

    شكرا لك اشد الشكر لم اكن اعرف عنها كنت اريد شيئ اراجع فيه اللغه بشكل كامل و سريع و احترافي و لدي سؤال هل انتم تشرحون ال dom في قسم جافا سكربت 

    • أعجبني 1
×
×
  • أضف...