ng-grid - перетаскивание заголовка столбца с изображением заставляет Firefox перенаправить в исходное местоположение изображения
Я собрал быстрый поршень, который демонстрирует проблему.
Пожалуйста, откройте это в Firefox и перетащите столбец утки на другой столбец, чтобы изменить их порядок.
http://plnkr.co/edit/dO2uhMKDXQtFbNMkSieR?p=preview
Это происходит все время в Firefox, но не в Chrome или IE.
Я могу заставить это произойти в Chrome, если я добавлю точки останова в файл ng-grid.js для перетаскиваемой функциональности. Я ничего не манипулирую, я просто перебираю код, и это происходит так, как в Firefox. Я предполагаю, что это означает, что это проблема синхронизации, поскольку отладка изменяет время выполнения.
2 ответа
Я до сих пор понятия не имею, почему проблема возникает в Firefox, когда у вас есть IMG в заголовке....
НО...
Вместо этого я попытался установить фоновое изображение на DIV, и это, похоже, решило проблему.
http://plnkr.co/edit/Y1qF59YExcN1yCDYWlvT?p=preview
.image_duck {background-image: url ( http://png-5.findicons.com/files/icons/1799/bathroom/48/duck.png); повторение фона: без повтора; высота: 100 пикселей; ширина: 25 пикселей; дисплей: блок; }
Полностью изменился мой последний ответ. Не знаю, что я тестировал вчера, но, видимо, я не работал. Итак, вот моя следующая попытка:
Используйте эту директиву
app.directive('linkPrevent', function() {
return {
link: function(scope, element, attrs) {
setTimeout(function() {
element.unbind('drop');
element.bind('drop', function(e) {
if (e.preventDefault) {
e.preventDefault();
}
if (e.stopPropogation) {
e.stopPropogation();
}
})
})
}
}
});
И эти шаблоны Headercell
var myHeaderCellTemplate = '<div link-prevent class="ngHeaderSortColumn {{col.headerClass}}" ng-style="{cursor: col.cursor}" ng-class="{ ngSorted: !noSortVisible }">' +
'<div link-prevent ng-click="col.sort($event)" ng-class="\'colt\' + col.index" class=""><img ng-src="http://png-5.findicons.com/files/icons/1799/bathroom/48/duck.png" alt="{{col.displayName}}"></div>' +
'<div link-prevent class="ngSortButtonDown" ng-show="col.showSortButtonDown()"></div>' +
'<div link-prevent class="ngSortButtonUp" ng-show="col.showSortButtonUp()"></div>' +
'<div link-prevent class="ngSortPriority">{{col.sortPriority}}</div>' +
'</div>' +
'<div ng-show="col.resizable" class="ngHeaderGrip" ng-click="col.gripClick($event)" ng-mousedown="col.gripOnMouseDown($event)"></div>';
var stdHeaderCellTemplate = '<div link-prevent class="ngHeaderSortColumn {{col.headerClass}}" ng-style="{cursor: col.cursor}" ng-class="{ ngSorted: !noSortVisible }">' +
'<div link-prevent ng-click="col.sort($event)" ng-class="\'colt\' + col.index" class="ngHeaderText" style="height:30px">{{col.displayName}}</div>' +
'<div link-prevent class="ngSortButtonDown" ng-show="col.showSortButtonDown()"></div>' +
'<div link-prevent class="ngSortButtonUp" ng-show="col.showSortButtonUp()"></div>' +
'<div link-prevent class="ngSortPriority">{{col.sortPriority}}</div>' +
'</div>' +
'<div ng-show="col.resizable" class="ngHeaderGrip" ng-click="col.gripClick($event)" ng-mousedown="col.gripOnMouseDown($event)"></div>';
и эти columnDefs
columnDefs: [{
field: 'name',
headerCellTemplate: myHeaderCellTemplate
}, {
field: 'age',
headerCellTemplate: stdHeaderCellTemplate
}]
Теперь это работает в этом Plunker (Да, ленивый mainguy сделал тщательный тест на этот раз. Перетащил его везде)
Примечание. Это предотвратит использование по умолчанию для каждого события удаления.
Я назначил его повсеместно, чтобы убедиться, что не осталось элементов, которые хотя и очень малы (кнопка сортировки) и способны связываться с новой целью.
Имейте в виду, что размер ngHeaderText установлен на 30 пикселей, чтобы заполнить весь заголовок. Если высота не подходит, может быть небольшой промежуток, через который может проходить связывание по умолчанию (подлый bastich!)