Korzystając z edytora kodów asów, mogę zablokować lub wykonać fragment kodu tylko do odczytu, ale nadal zezwalać na zapisywanie lub edytowanie innych linii kodu podczas sesji?Edytor asów: Blokuj lub Odczytuj fragment kodu
Odpowiedz
Oto początek rozwiązanie:
$(function() {
var editor = ace.edit("editor1")
, session = editor.getSession()
, Range = require("ace/range").Range
, range = new Range(1, 4, 1, 10)
, markerId = session.addMarker(range, "readonly-highlight");
session.setMode("ace/mode/javascript");
editor.keyBinding.addKeyboardHandler({
handleKeyboard : function(data, hash, keyString, keyCode, event) {
if (hash === -1 || (keyCode <= 40 && keyCode >= 37)) return false;
if (intersects(range)) {
return {command:"null", passEvent:false};
}
}
});
before(editor, 'onPaste', preventReadonly);
before(editor, 'onCut', preventReadonly);
range.start = session.doc.createAnchor(range.start);
range.end = session.doc.createAnchor(range.end);
range.end.$insertRight = true;
function before(obj, method, wrapper) {
var orig = obj[method];
obj[method] = function() {
var args = Array.prototype.slice.call(arguments);
return wrapper.call(this, function(){
return orig.apply(obj, args);
}, args);
}
return obj[method];
}
function intersects(range) {
return editor.getSelectionRange().intersects(range);
}
function preventReadonly(next, args) {
if (intersects(range)) return;
next();
}
});
zobaczyć to działa w tym skrzypce: http://jsfiddle.net/bzwheeler/btsxgena/
Główne elementy pracy są:
- tworzyć początek i koniec kotwy ace który śledź lokalizację "tylko do odczytu", gdy zmienia się dokument wokół niej.
- utwórz zakres enkapsulacji zakotwiczeń
- dodaj niestandardową klawiaturę, aby sprawdzić, czy bieżące zbliżające się naciśnięcie klawisza wpłynie na zakres tylko do odczytu i anulować, jeśli tak.
- dodać niestandardowe paste/cut ładowarki do ochrony przed menu i menu przeglądarki kliknij prawym przyciskiem myszy Wytnij/Wklej działań
Mam problem ze zrozumieniem, co się dzieje w funkcji "przed", ale wiem, że "origArgs" nigdy nie jest zdefiniowany i powoduje "preventReadOnly", by wymiotować, gdy próbuje wywołać next() po wycięciu lub wklejeniu. – Southerneer
Dobry połów! Edytowałem implementację before(), aby użyć '.call' i przekazać' args', a nie 'origArgs', które było niezdefiniowane, jak zauważyłeś. – bzwheeler
Co robi tutaj addKeyboardHandler? wyjaśnij pls. – rjohari23
Proponuję coś innego łatwiejsze i bardziej wiarygodne, aby zapobiec gamę być modyfikowane (sprawdź to!)
var old$tryReplace = editor.$tryReplace;
editor.$tryReplace = function(range, replacement) {
return intersects(range)?null:old$tryReplace.apply(this, arguments);
}
var session = editor.getSession();
var oldInsert = session.insert;
session.insert = function(position, text) {
return oldInsert.apply(this, [position, outsideRange(position)?text:""]);
}
var oldRemove = session.remove;
session.remove = function(range) {
return intersects(range)?false:oldRemove.apply(this, arguments);
}
var oldMoveText = session.moveText;
session.moveText = function(fromRange, toPosition, copy) {
if (intersects(fromRange) || !outsideRange(toPosition)) return fromRange;
return oldMoveText.apply(this, arguments)
}
outsideRange = function (position) {
var s0 = range.start;
if (position.row < s0.row || (position.row == s0.row && position.column <= s0.column)) return true; // position must be before range.start
var e0 = range.end;
if (position.row > e0.row || (position.row == e0.row && position.column >= e0.column)) return true; // or after range.end
return false;
}
intersects = function(withRange) {
var e = withRange.end, s0 = range.start, s = withRange.start, e0 = range.end;
if (e.row < s0.row || (e.row == s0.row && e.column <= s0.column)) return false; // withRange.end must be before range.start
if (s.row > e0.row || (s.row == e0.row && s.column >= e0.column)) return false; // or withRange.start must be after range.end
return true;
}
- 1. Edytor asów ace.js Rozmiar pliku
- 2. Edytor asów w aplikacji sieci Web PHP
- 3. Edytor asów otrzymuje wartość w pojedynczej linii
- 4. edytor kodu z autouzupełniania
- 5. darmowy edytor kodu sql?
- 6. KDoc: Wstaw fragment kodu
- 7. C# fragment kodu autopoziomu?
- 8. Wyjaśnij ten fragment kodu
- 9. Co robi ten fragment kodu? :() {: |: &} ;:
- 10. Wyświetl javascript jako fragment kodu
- 11. Edytor kodu JavaFX z zakreślaczem treści dla kodu Java
- 12. Wielojęzyczny edytor kodu źródłowego w linii poleceń:
- 13. Hacked, co robi ten fragment kodu?
- 14. Konstruktor zależność fragment kodu w Visual Studio
- 15. Blokuj wychodzące wiadomości SMS
- 16. Dobry edytor Symfony Netbeans lub Eclipse?
- 17. Bindować usługę FragmentActivity lub Fragment?
- 18. Jak osadzić edytor as z dowolnym numerem linii start
- 19. Proszę wyjaśnić ten fragment kodu pod względem kodu C#?
- 20. Blokuj zaznaczanie tekstu lub zaznaczanie wielu tekstów na raz.
- 21. Jak utworzyć fragment kodu w osobnym wątku?
- 22. Fragment kodu Erlang, który pokazuje swoje zalety?
- 23. Co to za fragment kodu Pythona?
- 24. Jak uwzględnić fragment kodu w prezentacji rzutnika?
- 25. Wyłączyć wbudowany fragment kodu Xcode 6?
- 26. Rozszerzanie klasy Ruby z samodzielny fragment kodu
- 27. Java wyjście Fragment kodu wyjaśnienie wymagane
- 28. C# blokuj i słuchaj AnulujToken
- 29. Odczytuj nazwy plików z katalogu
- 30. MapView w Fragment (Android 4.0 lub nowszy)
Potrzebujesz tylko jednego segmentu lub wielu? Czy cały segment może zostać usunięty? Jeśli selekcja obejmuje część tylko do odczytu segmentów, a użytkownik naciśnie przycisk delete, czy resztę zaznaczonego tekstu należy usunąć? –
Też potrzebuję tej funkcji! – ufucuk