2010-12-07 2 views
5

(отредактирован, чтобы дать лучшее описание ответ я дал)Получение WebView действовать так же, как Safari

Я создал очень простой браузер в InterfaceBuilder состоящий из навигационной панели и WebView.

Все работает отлично, за исключением случаев, когда я пытаюсь выполнить вкладку между полями ввода, является веб-просмотр, фокус переходит в навигационную панель.

Я предполагаю, что мне нужно что-то сделать с цепочкой ответчиков, но я не смог выяснить, что.

Любые советы?

Спасибо, Келли

+0

Здесь необходимо добавить пару вещей. Для большинства веб-сайтов установка initialFirstResponder окна в webview исправила мою проблему. Тем не менее, у меня все еще были странные проблемы при использовании моей инфраструктуры javascript (cappuccino). Из того, что я могу сказать, большинство веб-браузеров отправляют событие «keydown» dom с кодом KeyCode 9 и charCode 0, когда вы нажимаете клавишу вкладки.Веб-просмотр отправляет событие keydown dom, которое имеет как keyCode, так и charCode, равное 9, что путало структуру. Если я выясню, как это исправить, я отправлю обратно. – 2011-01-07 13:22:28

ответ

12

Там, вероятно, никто в мире, который заботится об этом, но я собираюсь ответить на него в случае, если кто-то нуждается в этом в какой-то момент.

Как я упоминал в комментариях, я использую фреймворк cappuccino, и на самом деле у меня было 3 разных проблемы.

Позвольте мне рассказать об этом здесь.

Я создавал приложение для какао с встроенным WebView и загружаю страницу с приложением cappuccino. Вначале табуляция между полями не работала ни на одной из форм на любой веб-странице.

  1. Как я уже сказал в комментариях, если вы используете IB, вы можете установить «initialFirstponder» для Windows как webview, и, по крайней мере, «нормальные» формы работают правильно. Капучино все равно этого не делал.
  2. Вторая проблема заключалась в том, что keyCode и charCode в dom-событии отличались от WebView в какао для Safari. Оказывается, есть что-то, называемое режимом «клавиатурных причуд». Если вы ищете _needsKeyboardEventDisambiguationQuirks в WebView Исходный код ObjC вы увидите, что он делает исключение для сафари, отключая его. Предполагается отключить его для более старых версий WebKit, но это не так. см. webkit bug 32694 Чтобы решить эту проблему, мне пришлось сделать две разные вещи. a) переопределить _needsKeyboardEventDisambiguationQuirks так, чтобы он возвращал NO . B) если WebView уже создан при переопределении этого метода, вам необходимо также позвонить [[webviewinstance preferences] _postPreferencesChangesNotification], чтобы заставить его работать. В этом случае ваш WebView отправляет события DOM, такие как Safari.

  3. Наконец, cappuccino смотрел строку пользовательского агента, чтобы определить, как обрабатывать некоторые вещи. Он проверял WebKit и Safari. Я обрезал строку пользовательского агента Safari и установил ее как пользовательскую строку пользовательского агента для WebView.

    [mywebviewinstance setCustomUserAgent: @"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"] 
    

Наконец, все работало так же, как это было в сафари.

Надеюсь, это поможет кому-то!