☰

JW Player Double-Tap Fullscreen Blocker

Blocks JW Player's double-tap fullscreen trigger on ohentai.org. Manual fullscreen, play/pause, and in-fullscreen gestures remain functional.

スクリプトをインストールするには、Tampermonkey, Greasemonkey や Violentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

スクリプトをインストールするには、Tampermonkey や Violentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、Tampermonkey や Userscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

作者のサイトでサポートを受ける。または、このスクリプトの質問や評価の投稿はこちら、通報はこちらへお寄せください
// ==UserScript==
// @name               JW Player Double-Tap Fullscreen Blocker
// @namespace          https://sleazyfork.org/en/users/1645436-angraecums
// @version            27.03
// @author             angraecums
// @description        Blocks JW Player's double-tap fullscreen trigger on ohentai.org. Manual fullscreen, play/pause, and in-fullscreen gestures remain functional.
// @license            MIT
// @icon               https://ohentai.org/favicon.ico
// @homepageURL        https://sleazyfork.org/en/scripts/596682-jw-player-double-tap-fullscreen-blocker
// @supportURL         https://sleazyfork.org/en/scripts/596682-jw-player-double-tap-fullscreen-blocker/feedback
// @match              *://*.ohentai.org/*
// @grant              none
// @run-at             document-start
// ==/UserScript==
(function () {
    'use strict';

    const TAG = '[JW-DT-Blocker]';
    const DOUBLE_TAP_WINDOW = 300; // ms

    // ---------------------------------------------------------------
    // 1. Neutralize webkitEnterFullscreen (iOS Safari fallback path)
    // ---------------------------------------------------------------
    ['webkitEnterFullscreen', 'webkitEnterFullScreen'].forEach(function (name) {
        const original = HTMLVideoElement.prototype[name];
        if (typeof original === 'function') {
            HTMLVideoElement.prototype[name] = function () {
                console.log(TAG, 'Intercepted', name);
                return original.apply(this, arguments);
            };
        }
    });

    // ---------------------------------------------------------------
    // 2. Suppress window-level dblclick (prevents bubbling to player)
    // ---------------------------------------------------------------
    window.addEventListener('dblclick', function (e) {
        e.stopImmediatePropagation();
    }, true);

    // ---------------------------------------------------------------
    // 3. Block the second touchstart on JW Player containers only.
    //    First tap still passes through so single-tap controls work.
    // ---------------------------------------------------------------
    let lastTapTime = 0;

    document.addEventListener('touchstart', function (e) {
        const target = e.target;
        if (!target || typeof target.closest !== 'function') return;
        if (!target.closest('.jwplayer')) return;

        const now = Date.now();
        if (now - lastTapTime < DOUBLE_TAP_WINDOW) {
            console.log(TAG, 'Second tap blocked on JW Player container.');
            e.stopImmediatePropagation();
        }
        lastTapTime = now;
    }, true);

    // ---------------------------------------------------------------
    // 4. Disable native double-tap gesture via CSS touch-action
    // ---------------------------------------------------------------
    const style = document.createElement('style');
    style.textContent = [
        '.jwplayer,',
        '.jw-media,',
        'video.jw-video {',
        '    touch-action: manipulation !important;',
        '}'
    ].join('\n');
    (document.head || document.documentElement).appendChild(style);

    console.log(TAG, 'v27.01 active.');
})();