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

السؤال

نشر

 

أبحث عن طريقة لاكتشاف ما إذا كان حدث النقر click event قد حدث خارج أحد المكونات (أي ضغط المستخدم على مكون آخر)،في jQuery توجد الدالة closest لمعرفة ما إذا كان الهدف target  هو نفس عنصر DOM أو أحد العناصر الأباء له. فإن كان الهدف target ينتمي إلى أحد العناصر الفرعية (الأبناء)،  لا يعتبر خارج المكون.

 

لذا في المكون الخاص بي أريد كتابة دالة للقيام بمثل هذا الأمر (التأكد من أن حدث النقر قد تم خارج هذا المكون). أعتقد أنه عندما تعمل هذه الدالة، أحتاج إلى مقارنة الهدف target مع عناصر DOM التابعة للمكون الخاص بي. 

يحتوي حدث النقر على خصائص مثل "path" الذي يبدو أنه يحمل مسار DOM الذي سلكه الحدث. لست متأكدًا مما يجب أن أكتبه في هذه الدالة.

Recommended Posts

  • 0
نشر

يمكنك عمل هذا عن طريق ال ref 
 

import React, { Component } from 'react';

export default class OutsideAlerter extends Component {
    componentDidMount() {
        document.addEventListener('mousedown', this.handleClickOutside);
    }

    componentWillUnmount() {
        document.removeEventListener('mousedown', this.handleClickOutside);
    }

	// عند الضغط بالماوس عل الصفحة 
    handleClickOutside = (event) => {
      // نتحقق هل العنصر لديه حدث mousedown أم لا
        if (this.wrapperRef && !this.wrapperRef.current.contains(event.target)) {
          // إذا لم يحتوي على الحدث
            alert('لقد قمت بالنقر خارج المحتوى الخاص بي');
        }
    }

    render() {
      // نقوم بإعطاء العنصر ref
        return <div ref={ref => this.wrapperRef =ref }>{this.props.children}</div>;
    }
}

 

  • 0
نشر

يمكنك استخدام مرجع متعلق بمكون وبمساعدة خطافات react الامر يصبح سهل جدا 

import React, { useRef, useEffect } from 'react';

export default function App() {
  const node = useRef();

  const handleClick = (e) => {
    if (node.current.contains(e.target)) {
      console.log('تم الضغط داخل المكون');
      return;
    }
    console.log('تم الضغط خارج المكون');
  };

  useEffect(() => {
    // اضافة عند التشغيل
    document.addEventListener('mousedown', handleClick);
    
    // ازالة عند توقف التشغيل
    return () => {
      document.removeEventListener('mousedown', handleClick);
    };
  }, []);

  
  return <div ref={node}>...........</div>;
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...