Удаление отдельного конкретного пользовательского скрипта из WKUserContentController

Я использую addUserScript() для добавления пользовательского скрипта в WKUserContentController моего WKWebView. Я заметил, что даже если вызвать loadRequest(), сценарий остается.

В некоторых случаях мне может потребоваться удалить некоторые сценарии и добавить другие. Однако, похоже, что единственный способ удалить сценарии - это removeAllUserScripts(). Это очень неудобно, так как это означает, что мне придется удалить все сценарии, а затем повторно добавить те, которые я хотел сохранить.

Если кто-нибудь знает, как удалить конкретный скрипт (по имени, дескриптору и т. Д.), Пожалуйста, сообщите мне.

2 ответа

Я не думаю, что "удаление сценария" является чем-то возможным (или даже значимым, если я правильно понимаю ваш вопрос).

"Сценарий" - это просто текст, который используется для предоставления среде Javascript определений таких элементов, как переменные, функции и т. Д. Два сценария могут очень хорошо перекрывать друг друга (например, определять одну и ту же функцию foo ()), поэтому в зависимости от того, в каком порядке вы их загрузили, у вас будет другое конечное окружение (у вас есть только определение foo () последнего загруженного скрипта). Так что же означает "удалить сценарий" в этом случае?

Если вы действительно хотите избавиться от элементов вашей среды Javascript, вы всегда можете переопределить их так, чтобы они ничего не делали (например, переопределить foo () в {}). Но я думаю, что самый простой способ - просто больше не использовать foo ().

Вы можете попробовать что-то вроде этого:

      -(bool)removeUserScriptByValue:(nonnull NSString*)scriptValue{
    bool retVal = false;
    NSMutableArray<WKUserScript*>* userscripts = [NSMutableArray arrayWithArray:self.configuration.userContentController.userScripts];
    for(int i=0; i<userscripts.count; i++){
        WKUserScript* userScript = [userscripts objectAtIndex:i];
        if([userScript.source rangeOfString:scriptValue].location != NSNotFound){
            retVal = true;
            [userscripts removeObjectAtIndex:i];
            break;
        }
    }
    if(retVal){
        [self.configuration.userContentController removeAllUserScripts];
        for(WKUserScript* script in userscripts)
            [self.configuration.userContentController addUserScript:script];
    }
    return retVal;
}
Другие вопросы по тегам