Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Not working with React event handlers #229

Closed
julienc91 opened this issue Sep 25, 2020 · 1 comment
Closed

Not working with React event handlers #229

julienc91 opened this issue Sep 25, 2020 · 1 comment

Comments

@julienc91
Copy link

julienc91 commented Sep 25, 2020

Hi,

I'm using pjax along with some React components. I'm trying to disable some links programmatically, depending on the current state of the component, by using onClick/onClickCapture event handlers along with some stopPropagation and preventDefault methods. But this is not working as expected, as the links are still enabled.

Here is a small example to reproduce:

  • index.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Test pjax</title>
</head>
<body>
    <div><a href="/foo.html" onclick="return false">Go to /foo without React</a></div>
    <div id="root"></div>

    <script crossorigin src="https://cdn.jsdelivr.net/npm/pjax/pjax.min.js"></script>
    <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
    <script crossorigin src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>

    <script>
        const pjax = new Pjax({
            selectors: ['body'],
            elements: 'a'
        })
    </script>

    <script type="text/babel">
        const App = () => {

            React.useEffect(() => {
                pjax.refresh()
            }, [])

            const handleClick = e => {
                e.preventDefault()
                e.stopPropagation()
                return false
            }

            return (
                <div onClickCapture={handleClick}>
                    <a onClick={handleClick} href="/foo.html">Go to /foo with React</a>
                </div>
            )
        }

        ReactDOM.render(<App />, document.getElementById('root'))
    </script>
</body>
</html>
  • foo.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Test pjax</title>
</head>
<body>
    This page should not have been reached
</body>
</html>

Tested with the latest versions of Firefox and Chrome.

@julienc91
Copy link
Author

julienc91 commented Sep 25, 2020

From what I understand, this is because React's SyntheticEvents are always processed after native events, which are the one used by Pjax.
A quick test shows indeed that the isDefaultPrevented function returns false after the onClick handler is being called, but this is already too late.

The solution is... don't mix native events with React events, which means using a React-compatible version of pjax. Unfortunately for me, this won't be possible as my app is not a full-React app, but just isolated components here and there, but this is definitely not pjax's fault.

Anyway, if someone still manages to find a workaround for this particular case, I'd be happy to see it!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant